summaryrefslogtreecommitdiffstats
path: root/config-model/src/test/derived
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /config-model/src/test/derived
Publish
Diffstat (limited to 'config-model/src/test/derived')
-rw-r--r--config-model/src/test/derived/advanced/advanced.sd105
-rw-r--r--config-model/src/test/derived/advanced/attributes.cfg19
-rw-r--r--config-model/src/test/derived/advanced/documentmanager.cfg84
-rw-r--r--config-model/src/test/derived/advanced/ilscripts.cfg24
-rw-r--r--config-model/src/test/derived/advanced/index-info.cfg97
-rw-r--r--config-model/src/test/derived/advanced/rank-profiles.cfg18
-rw-r--r--config-model/src/test/derived/advanced/summary.cfg33
-rw-r--r--config-model/src/test/derived/advanced/summarymap.cfg16
-rwxr-xr-xconfig-model/src/test/derived/annotationsimplicitstruct/annotationsimplicitstruct.sd12
-rwxr-xr-xconfig-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg49
-rw-r--r--config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg2
-rwxr-xr-xconfig-model/src/test/derived/annotationsimplicitstruct/index-info.cfg9
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance/annotationsinheritance.sd39
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance/documentmanager.cfg135
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance/ilscripts.cfg2
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance/index-info.cfg9
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance2/annotationsinheritance2.sd32
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance2/documentmanager.cfg97
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance2/ilscripts.cfg2
-rwxr-xr-xconfig-model/src/test/derived/annotationsinheritance2/index-info.cfg9
-rw-r--r--config-model/src/test/derived/annotationsoutsideofdocument/annotationsoutsideofdocument.sd11
-rw-r--r--config-model/src/test/derived/annotationspolymorphy/annotationspolymorphy.sd15
-rwxr-xr-xconfig-model/src/test/derived/annotationspolymorphy/documentmanager.cfg58
-rwxr-xr-xconfig-model/src/test/derived/annotationspolymorphy/index-info.cfg9
-rwxr-xr-xconfig-model/src/test/derived/annotationsreference/annotationsreference.sd26
-rwxr-xr-xconfig-model/src/test/derived/annotationsreference/documentmanager.cfg94
-rwxr-xr-xconfig-model/src/test/derived/annotationsreference/ilscripts.cfg2
-rwxr-xr-xconfig-model/src/test/derived/annotationsreference/index-info.cfg9
-rw-r--r--config-model/src/test/derived/annotationsreference2/annotationsreference2.sd9
-rwxr-xr-xconfig-model/src/test/derived/annotationssimple/annotationssimple.sd8
-rwxr-xr-xconfig-model/src/test/derived/annotationssimple/documentmanager.cfg40
-rw-r--r--config-model/src/test/derived/annotationssimple/ilscripts.cfg2
-rwxr-xr-xconfig-model/src/test/derived/annotationssimple/index-info.cfg9
-rw-r--r--config-model/src/test/derived/annotationsstruct/annotationsstruct.sd11
-rw-r--r--config-model/src/test/derived/annotationsstruct/documentmanager.cfg58
-rw-r--r--config-model/src/test/derived/annotationsstructarray/annotationsstructarray.sd11
-rw-r--r--config-model/src/test/derived/annotationsstructarray/documentmanager.cfg60
-rw-r--r--config-model/src/test/derived/arrays/arrays.sd32
-rw-r--r--config-model/src/test/derived/arrays/documentmanager.cfg63
-rw-r--r--config-model/src/test/derived/arrays/ilscripts.cfg12
-rw-r--r--config-model/src/test/derived/arrays/index-info.cfg63
-rw-r--r--config-model/src/test/derived/attributeprefetch/attributeprefetch.sd86
-rw-r--r--config-model/src/test/derived/attributeprefetch/attributes.cfg342
-rw-r--r--config-model/src/test/derived/attributeprefetch/documentmanager.cfg127
-rw-r--r--config-model/src/test/derived/attributeprefetch/ilscripts.cfg38
-rw-r--r--config-model/src/test/derived/attributeprefetch/index-info.cfg115
-rw-r--r--config-model/src/test/derived/attributeprefetch/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/attributeprefetch/summary.cfg51
-rw-r--r--config-model/src/test/derived/attributeprefetch/summarymap.cfg61
-rw-r--r--config-model/src/test/derived/attributerank/attributerank.sd41
-rw-r--r--config-model/src/test/derived/attributerank/rank-profiles.cfg34
-rw-r--r--config-model/src/test/derived/attributes/attributes.cfg342
-rw-r--r--config-model/src/test/derived/attributes/attributes.sd121
-rw-r--r--config-model/src/test/derived/attributes/ilscripts.cfg42
-rw-r--r--config-model/src/test/derived/attributes/index-info.cfg141
-rw-r--r--config-model/src/test/derived/attributes/summarymap.cfg52
-rw-r--r--config-model/src/test/derived/combinedattributeandindexsearch/combinedattributeandindexsearch.sd34
-rw-r--r--config-model/src/test/derived/combinedattributeandindexsearch/index-info.cfg41
-rw-r--r--config-model/src/test/derived/complex/attributes.cfg171
-rw-r--r--config-model/src/test/derived/complex/complex.sd150
-rw-r--r--config-model/src/test/derived/complex/documentmanager.cfg119
-rw-r--r--config-model/src/test/derived/complex/ilscripts.cfg48
-rw-r--r--config-model/src/test/derived/complex/rank-profiles.cfg68
-rw-r--r--config-model/src/test/derived/complex/summary.cfg43
-rw-r--r--config-model/src/test/derived/complex/summarymap.cfg34
-rw-r--r--config-model/src/test/derived/deriver/child.sd12
-rw-r--r--config-model/src/test/derived/deriver/grandparent.sd12
-rw-r--r--config-model/src/test/derived/deriver/ilscripts.cfg8
-rw-r--r--config-model/src/test/derived/deriver/parent.sd12
-rw-r--r--config-model/src/test/derived/documentderiver/compression_body.sd20
-rw-r--r--config-model/src/test/derived/documentderiver/compression_both.sd26
-rw-r--r--config-model/src/test/derived/documentderiver/compression_header.sd20
-rw-r--r--config-model/src/test/derived/documentderiver/documentmanager.cfg319
-rw-r--r--config-model/src/test/derived/documentderiver/mail.sd112
-rw-r--r--config-model/src/test/derived/documentderiver/music.sd44
-rw-r--r--config-model/src/test/derived/documentderiver/newsarticle.sd126
-rw-r--r--config-model/src/test/derived/documentderiver/newssummary.sd165
-rw-r--r--config-model/src/test/derived/documentderiver/sombrero.sd36
-rw-r--r--config-model/src/test/derived/documentderiver/vsmfields.cfg489
-rw-r--r--config-model/src/test/derived/documentderiver/vsmsummary.cfg6
-rw-r--r--config-model/src/test/derived/emptychild/child.sd5
-rw-r--r--config-model/src/test/derived/emptychild/parent.sd8
-rw-r--r--config-model/src/test/derived/emptychild/summary.cfg19
-rw-r--r--config-model/src/test/derived/emptydefault/attributes.cfg0
-rw-r--r--config-model/src/test/derived/emptydefault/documentmanager.cfg43
-rw-r--r--config-model/src/test/derived/emptydefault/emptydefault.sd16
-rw-r--r--config-model/src/test/derived/emptydefault/ilscripts.cfg6
-rw-r--r--config-model/src/test/derived/emptydefault/index-info.cfg25
-rw-r--r--config-model/src/test/derived/emptydefault/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/emptydefault/summary.cfg9
-rw-r--r--config-model/src/test/derived/emptydefault/summarymap.cfg7
-rw-r--r--config-model/src/test/derived/exactmatch/exactmatch.sd21
-rw-r--r--config-model/src/test/derived/exactmatch/ilscripts.cfg6
-rw-r--r--config-model/src/test/derived/exactmatch/index-info.cfg21
-rw-r--r--config-model/src/test/derived/fieldlength/attributes.cfg4
-rw-r--r--config-model/src/test/derived/fieldlength/fieldlength.sd73
-rwxr-xr-xconfig-model/src/test/derived/flickr/flickrphotos.sd24
-rw-r--r--config-model/src/test/derived/gemini2/gemini.sd27
-rw-r--r--config-model/src/test/derived/gemini2/rank-profiles.cfg29
-rw-r--r--config-model/src/test/derived/id/attributes.cfg0
-rw-r--r--config-model/src/test/derived/id/documentmanager.cfg40
-rw-r--r--config-model/src/test/derived/id/id.sd12
-rw-r--r--config-model/src/test/derived/id/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/id/index-info.cfg45
-rw-r--r--config-model/src/test/derived/id/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/id/summary.cfg11
-rw-r--r--config-model/src/test/derived/id/summarymap.cfg7
-rw-r--r--config-model/src/test/derived/id/vsmsummary.cfg8
-rw-r--r--config-model/src/test/derived/indexinfo_fieldsets/index-info.cfg74
-rw-r--r--config-model/src/test/derived/indexinfo_fieldsets/indexinfo_fieldsets.sd50
-rw-r--r--config-model/src/test/derived/indexinfo_lowercase/index-info.cfg249
-rw-r--r--config-model/src/test/derived/indexinfo_lowercase/indexinfo_lowercase.sd120
-rw-r--r--config-model/src/test/derived/indexschema/index-info.cfg311
-rw-r--r--config-model/src/test/derived/indexschema/indexschema.cfg221
-rw-r--r--config-model/src/test/derived/indexschema/indexschema.sd161
-rw-r--r--config-model/src/test/derived/indexschema/vsmfields.cfg194
-rw-r--r--config-model/src/test/derived/indexswitches/attributes.cfg0
-rw-r--r--config-model/src/test/derived/indexswitches/documentmanager.cfg50
-rw-r--r--config-model/src/test/derived/indexswitches/ilscripts.cfg9
-rw-r--r--config-model/src/test/derived/indexswitches/index-info.cfg41
-rw-r--r--config-model/src/test/derived/indexswitches/indexswitches.sd32
-rw-r--r--config-model/src/test/derived/indexswitches/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/indexswitches/summary.cfg15
-rw-r--r--config-model/src/test/derived/indexswitches/summarymap.cfg7
-rw-r--r--config-model/src/test/derived/inheritance/attributes.cfg10
-rw-r--r--config-model/src/test/derived/inheritance/child.sd16
-rw-r--r--config-model/src/test/derived/inheritance/documentmanager.cfg426
-rw-r--r--config-model/src/test/derived/inheritance/father.sd12
-rw-r--r--config-model/src/test/derived/inheritance/grandparent.sd12
-rw-r--r--config-model/src/test/derived/inheritance/ilscripts.cfg9
-rw-r--r--config-model/src/test/derived/inheritance/index-info.cfg30
-rw-r--r--config-model/src/test/derived/inheritance/mother.sd13
-rw-r--r--config-model/src/test/derived/inheritance/mother/documentmanager.cfg426
-rw-r--r--config-model/src/test/derived/inheritance/rank-profiles.cfg16
-rw-r--r--config-model/src/test/derived/inheritance/summary.cfg26
-rw-r--r--config-model/src/test/derived/inheritance/summarymap.cfg17
-rw-r--r--config-model/src/test/derived/inheritancebadtypes/child.sd8
-rw-r--r--config-model/src/test/derived/inheritancebadtypes/parent.sd8
-rw-r--r--config-model/src/test/derived/inheritdiamond/.gitignore1
-rw-r--r--config-model/src/test/derived/inheritdiamond/child.sd12
-rw-r--r--config-model/src/test/derived/inheritdiamond/documentmanager.cfg269
-rw-r--r--config-model/src/test/derived/inheritdiamond/father.sd8
-rw-r--r--config-model/src/test/derived/inheritdiamond/grandparent.sd8
-rw-r--r--config-model/src/test/derived/inheritdiamond/mother.sd8
-rw-r--r--config-model/src/test/derived/inheritfromgrandparent/child.sd6
-rw-r--r--config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg99
-rw-r--r--config-model/src/test/derived/inheritfromgrandparent/grandparent.sd8
-rw-r--r--config-model/src/test/derived/inheritfromgrandparent/parent.sd6
-rw-r--r--config-model/src/test/derived/inheritfromnull/inheritfromnull.sd5
-rw-r--r--config-model/src/test/derived/inheritfromparent/attributes.cfg19
-rw-r--r--config-model/src/test/derived/inheritfromparent/child.sd6
-rw-r--r--config-model/src/test/derived/inheritfromparent/documentmanager.cfg81
-rw-r--r--config-model/src/test/derived/inheritfromparent/documenttypes.cfg119
-rw-r--r--config-model/src/test/derived/inheritfromparent/parent.sd17
-rw-r--r--config-model/src/test/derived/inheritfromparent/summarymap.cfg10
-rw-r--r--config-model/src/test/derived/inheritstruct/child.sd10
-rw-r--r--config-model/src/test/derived/inheritstruct/index-info.cfg21
-rw-r--r--config-model/src/test/derived/inheritstruct/parent.sd8
-rw-r--r--config-model/src/test/derived/integerattributetostringindex/integerattributetostringindex.sd28
-rw-r--r--config-model/src/test/derived/integerattributetostringindex/summary.cfg29
-rw-r--r--config-model/src/test/derived/mail/attributes.cfg40
-rw-r--r--config-model/src/test/derived/mail/documentmanager.cfg115
-rw-r--r--config-model/src/test/derived/mail/ilscripts.cfg33
-rw-r--r--config-model/src/test/derived/mail/index-info.cfg155
-rw-r--r--config-model/src/test/derived/mail/mail.sd99
-rw-r--r--config-model/src/test/derived/mail/onlydoc/documentmanager.cfg67
-rw-r--r--config-model/src/test/derived/mail/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/mail/summary.cfg51
-rw-r--r--config-model/src/test/derived/mail/summarymap.cfg16
-rw-r--r--config-model/src/test/derived/mail/vsmfields.cfg108
-rw-r--r--config-model/src/test/derived/mail/vsmsummary.cfg38
-rw-r--r--config-model/src/test/derived/mlr/mlr.sd20
-rw-r--r--config-model/src/test/derived/mlr/summary.cfg23
-rw-r--r--config-model/src/test/derived/multiplesummaries/attributes.cfg16
-rw-r--r--config-model/src/test/derived/multiplesummaries/ilscripts.cfg15
-rw-r--r--config-model/src/test/derived/multiplesummaries/index-info.cfg62
-rwxr-xr-xconfig-model/src/test/derived/multiplesummaries/juniperrc.cfg17
-rw-r--r--config-model/src/test/derived/multiplesummaries/multiplesummaries.sd199
-rw-r--r--config-model/src/test/derived/multiplesummaries/summary.cfg186
-rw-r--r--config-model/src/test/derived/multiplesummaries/summarymap.cfg50
-rw-r--r--config-model/src/test/derived/music/attributes.cfg209
-rw-r--r--config-model/src/test/derived/music/defs/attributes.def7
-rw-r--r--config-model/src/test/derived/music/defs/documentmanager.def12
-rw-r--r--config-model/src/test/derived/music/defs/extra.def4
-rw-r--r--config-model/src/test/derived/music/defs/ilscripts.def5
-rw-r--r--config-model/src/test/derived/music/defs/rank-profiles.def344
-rw-r--r--config-model/src/test/derived/music/defs/summarymap.def15
-rw-r--r--config-model/src/test/derived/music/ilscripts.cfg76
-rw-r--r--config-model/src/test/derived/music/index-info.cfg215
-rwxr-xr-xconfig-model/src/test/derived/music/juniperrc.cfg21
-rw-r--r--config-model/src/test/derived/music/music.sd176
-rw-r--r--config-model/src/test/derived/music/rank-profiles.cfg34
-rw-r--r--config-model/src/test/derived/music/summary.cfg103
-rw-r--r--config-model/src/test/derived/music/summarymap.cfg46
-rw-r--r--config-model/src/test/derived/music3/music3.sd70
-rw-r--r--config-model/src/test/derived/newrank/attributes.cfg190
-rw-r--r--config-model/src/test/derived/newrank/defs/attributes.def7
-rw-r--r--config-model/src/test/derived/newrank/defs/documentmanager.def12
-rw-r--r--config-model/src/test/derived/newrank/defs/extra.def4
-rw-r--r--config-model/src/test/derived/newrank/defs/ilscripts.def5
-rw-r--r--config-model/src/test/derived/newrank/defs/rank-profiles.def344
-rw-r--r--config-model/src/test/derived/newrank/defs/summarymap.def14
-rw-r--r--config-model/src/test/derived/newrank/ilscripts.cfg66
-rw-r--r--config-model/src/test/derived/newrank/index-info.cfg181
-rwxr-xr-xconfig-model/src/test/derived/newrank/juniperrc.cfg21
-rw-r--r--config-model/src/test/derived/newrank/newrank.sd146
-rw-r--r--config-model/src/test/derived/newrank/rank-profiles.cfg10
-rw-r--r--config-model/src/test/derived/newrank/summary.cfg97
-rw-r--r--config-model/src/test/derived/newrank/summarymap.cfg49
-rwxr-xr-xconfig-model/src/test/derived/orderilscripts/ilscripts.cfg5
-rwxr-xr-xconfig-model/src/test/derived/orderilscripts/orderilscripts.sd13
-rw-r--r--config-model/src/test/derived/position_array/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/position_array/index-info.cfg39
-rw-r--r--config-model/src/test/derived/position_array/position_array.sd8
-rw-r--r--config-model/src/test/derived/position_attribute/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/position_attribute/index-info.cfg37
-rw-r--r--config-model/src/test/derived/position_attribute/position_attribute.sd8
-rw-r--r--config-model/src/test/derived/position_extra/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/position_extra/index-info.cfg31
-rw-r--r--config-model/src/test/derived/position_extra/position_extra.sd11
-rw-r--r--config-model/src/test/derived/position_nosummary/position_nosummary.sd8
-rw-r--r--config-model/src/test/derived/position_nosummary/summary.cfg21
-rw-r--r--config-model/src/test/derived/position_nosummary/summarymap.cfg16
-rw-r--r--config-model/src/test/derived/position_summary/position_summary.sd8
-rw-r--r--config-model/src/test/derived/position_summary/summary.cfg23
-rw-r--r--config-model/src/test/derived/position_summary/summarymap.cfg19
-rw-r--r--config-model/src/test/derived/position_summary/vsmsummary.cfg14
-rw-r--r--config-model/src/test/derived/predicate_attribute/attributes.cfg19
-rw-r--r--config-model/src/test/derived/predicate_attribute/index-info.cfg15
-rw-r--r--config-model/src/test/derived/predicate_attribute/predicate_attribute.sd14
-rw-r--r--config-model/src/test/derived/predicate_attribute/summary.cfg17
-rw-r--r--config-model/src/test/derived/predicate_attribute/summarymap.cfg7
-rw-r--r--config-model/src/test/derived/prefixexactattribute/attributes.cfg38
-rw-r--r--config-model/src/test/derived/prefixexactattribute/documentmanager.cfg52
-rw-r--r--config-model/src/test/derived/prefixexactattribute/ilscripts.cfg12
-rw-r--r--config-model/src/test/derived/prefixexactattribute/index-info.cfg41
-rw-r--r--config-model/src/test/derived/prefixexactattribute/prefixexactattribute.sd52
-rw-r--r--config-model/src/test/derived/prefixexactattribute/vsmfields.cfg38
-rw-r--r--config-model/src/test/derived/rankexpression/macro.expression1
-rw-r--r--config-model/src/test/derived/rankexpression/overflow.expression300
-rw-r--r--config-model/src/test/derived/rankexpression/rank-profiles.cfg296
-rw-r--r--config-model/src/test/derived/rankexpression/rankexpression.expression1
-rw-r--r--config-model/src/test/derived/rankexpression/rankexpression.sd297
-rw-r--r--config-model/src/test/derived/rankexpression/summary.cfg25
-rw-r--r--config-model/src/test/derived/rankexpression/summarymap.cfg10
-rw-r--r--config-model/src/test/derived/rankprofiles/rank-profiles.cfg98
-rw-r--r--config-model/src/test/derived/rankprofiles/rankprofiles.sd72
-rw-r--r--config-model/src/test/derived/rankproperties/rank-profiles.cfg48
-rw-r--r--config-model/src/test/derived/rankproperties/rankproperties.sd61
-rw-r--r--config-model/src/test/derived/ranktypes/attributes.cfg0
-rw-r--r--config-model/src/test/derived/ranktypes/documentmanager.cfg51
-rw-r--r--config-model/src/test/derived/ranktypes/ilscripts.cfg11
-rw-r--r--config-model/src/test/derived/ranktypes/index-info.cfg47
-rw-r--r--config-model/src/test/derived/ranktypes/rank-profiles.cfg79
-rw-r--r--config-model/src/test/derived/ranktypes/ranktypes.sd32
-rw-r--r--config-model/src/test/derived/ranktypes/summary.cfg13
-rw-r--r--config-model/src/test/derived/ranktypes/summarymap.cfg7
-rw-r--r--config-model/src/test/derived/reserved_position/reserved_position.sd4
-rw-r--r--config-model/src/test/derived/sorting/attributes.cfg57
-rw-r--r--config-model/src/test/derived/sorting/sorting.sd53
-rw-r--r--config-model/src/test/derived/streamingjuniper/streamingjuniper.sd15
-rw-r--r--config-model/src/test/derived/streamingjuniper/vsmsummary.cfg11
-rw-r--r--config-model/src/test/derived/streamingstruct/documentmanager.cfg127
-rw-r--r--config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg100
-rw-r--r--config-model/src/test/derived/streamingstruct/streamingstruct.sd184
-rw-r--r--config-model/src/test/derived/streamingstruct/summary.cfg51
-rw-r--r--config-model/src/test/derived/streamingstruct/summarymap.cfg13
-rw-r--r--config-model/src/test/derived/streamingstruct/vsmfields.cfg434
-rw-r--r--config-model/src/test/derived/streamingstruct/vsmsummary.cfg83
-rw-r--r--config-model/src/test/derived/streamingstructdefault/streamingstructdefault.sd24
-rw-r--r--config-model/src/test/derived/streamingstructdefault/summary.cfg15
-rwxr-xr-xconfig-model/src/test/derived/structanyorder/documentmanager.cfg83
-rw-r--r--config-model/src/test/derived/structanyorder/ilscripts.cfg6
-rwxr-xr-xconfig-model/src/test/derived/structanyorder/index-info.cfg247
-rwxr-xr-xconfig-model/src/test/derived/structanyorder/structanyorder.sd27
-rw-r--r--config-model/src/test/derived/tensor/attributes.cfg57
-rw-r--r--config-model/src/test/derived/tensor/documenttypes.cfg65
-rw-r--r--config-model/src/test/derived/tensor/summary.cfg25
-rw-r--r--config-model/src/test/derived/tensor/tensor.sd18
-rw-r--r--config-model/src/test/derived/twostreamingstructs/documentmanager.cfg166
-rw-r--r--config-model/src/test/derived/twostreamingstructs/streamingstruct.sd183
-rw-r--r--config-model/src/test/derived/twostreamingstructs/summary.cfg51
-rw-r--r--config-model/src/test/derived/twostreamingstructs/summarymap.cfg13
-rw-r--r--config-model/src/test/derived/twostreamingstructs/vsmfields.cfg322
-rw-r--r--config-model/src/test/derived/twostreamingstructs/vsmsummary.cfg83
-rw-r--r--config-model/src/test/derived/twostreamingstructs/whatever.sd16
-rw-r--r--config-model/src/test/derived/types/attributes.cfg209
-rw-r--r--config-model/src/test/derived/types/documentmanager.cfg218
-rw-r--r--config-model/src/test/derived/types/ilscripts.cfg55
-rw-r--r--config-model/src/test/derived/types/index-info.cfg427
-rw-r--r--config-model/src/test/derived/types/rank-profiles.cfg16
-rw-r--r--config-model/src/test/derived/types/summary.0.cfg.part.types11255073219
-rw-r--r--config-model/src/test/derived/types/summary.cfg35
-rw-r--r--config-model/src/test/derived/types/summarymap.cfg25
-rw-r--r--config-model/src/test/derived/types/types.sd150
-rw-r--r--config-model/src/test/derived/types/vsmsummary.cfg23
-rw-r--r--config-model/src/test/derived/uri_array/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/uri_array/indexschema.cfg64
-rw-r--r--config-model/src/test/derived/uri_array/uri_array.sd8
-rw-r--r--config-model/src/test/derived/uri_wset/ilscripts.cfg4
-rw-r--r--config-model/src/test/derived/uri_wset/indexschema.cfg64
-rw-r--r--config-model/src/test/derived/uri_wset/uri_wset.sd8
302 files changed, 18636 insertions, 0 deletions
diff --git a/config-model/src/test/derived/advanced/advanced.sd b/config-model/src/test/derived/advanced/advanced.sd
new file mode 100644
index 00000000000..7d6623e268f
--- /dev/null
+++ b/config-model/src/test/derived/advanced/advanced.sd
@@ -0,0 +1,105 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search advanced {
+ document advanced {
+ field debug_src type string { }
+ field attributes_src type string { }
+ field location_str type string { }
+ field title_src type string { }
+ field product_src type string { }
+ field product2_src type string { }
+ field product3_src type string { }
+ }
+ field debug type string {
+ indexing {
+
+ # Initialize variables used for superduper ranking
+ 0 | set_var superduperus | set_var superdupereu | set_var superduperasia;
+
+ input debug_src | lowercase | summary | index | split ";" | for_each {
+ # Loop through each token in debug string
+ switch {
+ case "superduperus": 10 | set_var superduperus;
+ case "superdupereu": 10 | set_var superdupereu;
+ case "superduperasia": 10 | set_var superduperasia;
+ }
+ };
+ }
+ stemming: none
+ }
+
+ field attributes type string {
+ indexing {
+
+ # Initialize variables used for superduper ranking
+ 1 | set_var superdupermod;
+ 2 | set_var tmppubdate;
+ input attributes_src | lowercase | summary | index | split ";" | for_each {
+ # Loop through each token in attributes string
+ switch {
+
+ # De-rank PR articles using the following rules:
+ # 1. Set editedstaticrank to '1'
+ # 2. Subtract 2.5 hours (9000 seconds) from timestamp used in ranking
+ # 3. No superduper rank
+ case "typepr": 1 | set_var tmpsourcerank | get_var tmppubdate - 9000 | set_var tmppubdate | 0 | set_var superdupermod;
+ }
+ };
+ }
+ stemming: none
+ }
+
+ field title type string {
+ indexing: input title_src | index
+ indexing-rewrite: none
+ rank-type: identity
+ stemming: none
+ alias: headline
+ }
+
+ field title_s type string {
+ indexing: input title_src | summary
+ }
+
+ field product type string {
+ indexing: input product_src | switch {
+ case "": "myweb" | index | summary;
+ default: input product_src | index | summary;
+ }
+ indexing-rewrite: none
+ normalizing: none
+ }
+
+ field product2 type string {
+ indexing {
+ if (input product2_src == "foo") {
+ "bar" | index product2;
+ } else {
+ "baz" | index product2;
+ };
+ }
+ indexing-rewrite: none
+ normalizing: none
+ }
+
+ field product3 type string {
+ indexing: input product3_src | switch {
+ case "": "myweb" | index product3 | summary product3;
+ default: input product3_src | index product3 | summary product3;
+ }
+ normalizing: none
+ indexing-rewrite: none
+ }
+
+ field location type position {
+ indexing: input location_str | to_pos | attribute
+ }
+ field mysummary type string {
+ indexing: input title_src | summary
+ }
+ fieldset titleabstract {
+ fields: title
+ }
+ fieldset default {
+ fields: title
+ }
+}
diff --git a/config-model/src/test/derived/advanced/attributes.cfg b/config-model/src/test/derived/advanced/attributes.cfg
new file mode 100644
index 00000000000..afc25d5975c
--- /dev/null
+++ b/config-model/src/test/derived/advanced/attributes.cfg
@@ -0,0 +1,19 @@
+attribute[0].name "location_zcurve"
+attribute[0].datatype INT64
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch true
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/documentmanager.cfg b/config-model/src/test/derived/advanced/documentmanager.cfg
new file mode 100644
index 00000000000..98c3d379987
--- /dev/null
+++ b/config-model/src/test/derived/advanced/documentmanager.cfg
@@ -0,0 +1,84 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -1486737430
+datatype[1].arraytype[0].datatype 2
+datatype[2].id -1337915045
+datatype[2].structtype[0].name "advanced.header"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "debug_src"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "attributes_src"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[2].name "location_str"
+datatype[2].structtype[0].field[2].datatype 2
+datatype[2].structtype[0].field[3].name "title_src"
+datatype[2].structtype[0].field[3].datatype 2
+datatype[2].structtype[0].field[4].name "product_src"
+datatype[2].structtype[0].field[4].datatype 2
+datatype[2].structtype[0].field[5].name "product2_src"
+datatype[2].structtype[0].field[5].datatype 2
+datatype[2].structtype[0].field[6].name "product3_src"
+datatype[2].structtype[0].field[6].datatype 2
+datatype[2].structtype[0].field[7].name "debug"
+datatype[2].structtype[0].field[7].datatype 2
+datatype[2].structtype[0].field[8].name "attributes"
+datatype[2].structtype[0].field[8].datatype 2
+datatype[2].structtype[0].field[9].name "title"
+datatype[2].structtype[0].field[9].datatype 2
+datatype[2].structtype[0].field[10].name "product"
+datatype[2].structtype[0].field[10].datatype 2
+datatype[2].structtype[0].field[11].name "product2"
+datatype[2].structtype[0].field[11].datatype 2
+datatype[2].structtype[0].field[12].name "product3"
+datatype[2].structtype[0].field[12].datatype 2
+datatype[2].structtype[0].field[13].name "location_zcurve"
+datatype[2].structtype[0].field[13].datatype 4
+datatype[2].structtype[0].field[14].name "title_s"
+datatype[2].structtype[0].field[14].datatype 2
+datatype[2].structtype[0].field[15].name "location.position"
+datatype[2].structtype[0].field[15].datatype -1486737430
+datatype[2].structtype[0].field[16].name "location.distance"
+datatype[2].structtype[0].field[16].datatype 0
+datatype[2].structtype[0].field[17].name "mysummary"
+datatype[2].structtype[0].field[17].datatype 2
+datatype[2].structtype[0].field[18].name "rankfeatures"
+datatype[2].structtype[0].field[18].datatype 2
+datatype[2].structtype[0].field[19].name "summaryfeatures"
+datatype[2].structtype[0].field[19].datatype 2
+datatype[3].id -704605648
+datatype[3].structtype[0].name "advanced.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[4].id 686681444
+datatype[4].documenttype[0].name "advanced"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct -1337915045
+datatype[4].documenttype[0].bodystruct -704605648
+datatype[4].documenttype[0].fieldsets{titleabstract}.fields[0] "title"
+datatype[4].documenttype[0].fieldsets{default}.fields[0] "title"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[0] "attributes_src"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[1] "debug_src"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[2] "location_str"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[3] "product2_src"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[4] "product3_src"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[5] "product_src"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[6] "title_src"
diff --git a/config-model/src/test/derived/advanced/ilscripts.cfg b/config-model/src/test/derived/advanced/ilscripts.cfg
new file mode 100644
index 00000000000..ffa9a7e060f
--- /dev/null
+++ b/config-model/src/test/derived/advanced/ilscripts.cfg
@@ -0,0 +1,24 @@
+maxtermoccurrences 100
+ilscript[0].doctype "advanced"
+ilscript[0].docfield[0] "debug_src"
+ilscript[0].docfield[1] "attributes_src"
+ilscript[0].docfield[2] "location_str"
+ilscript[0].docfield[3] "title_src"
+ilscript[0].docfield[4] "product_src"
+ilscript[0].docfield[5] "product2_src"
+ilscript[0].docfield[6] "product3_src"
+ilscript[0].content[0] "clear_state | guard { 1 | set_var superdupermod; 2 | set_var tmppubdate; input attributes_src | lowercase | tokenize normalize | summary attributes | index attributes | split \";\" | for_each { switch { case \"typepr\": 1 | set_var tmpsourcerank | get_var tmppubdate - 9000 | set_var tmppubdate | 0 | set_var superdupermod; } }; }"
+ilscript[0].content[1] "clear_state | guard { 0 | set_var superduperus | set_var superdupereu | set_var superduperasia; input debug_src | lowercase | tokenize normalize | summary debug | index debug | split \";\" | for_each { switch { case \"superduperus\": 10 | set_var superduperus; case \"superdupereu\": 10 | set_var superdupereu; case \"superduperasia\": 10 | set_var superduperasia; } }; }"
+ilscript[0].content[2] "clear_state | guard { input location_str | to_pos | zcurve | attribute location_zcurve; }"
+ilscript[0].content[3] "clear_state | guard { input title_src | summary mysummary; }"
+ilscript[0].content[4] "clear_state | guard { input product_src | switch { case \"\": \"myweb\" | tokenize stem:\"SHORTEST\" | index product | summary product; default: input product_src | tokenize stem:\"SHORTEST\" | index product | summary product; }; }"
+ilscript[0].content[5] "clear_state | guard { if (input product2_src == \"foo\") { \"bar\" | tokenize stem:\"SHORTEST\" | index product2; } else { \"baz\" | tokenize stem:\"SHORTEST\" | index product2; }; }"
+ilscript[0].content[6] "clear_state | guard { input product3_src | switch { case \"\": \"myweb\" | tokenize stem:\"SHORTEST\" | index product3 | summary product3; default: input product3_src | tokenize stem:\"SHORTEST\" | index product3 | summary product3; }; }"
+ilscript[0].content[7] "clear_state | guard { input title_src | tokenize normalize | index title; }"
+ilscript[0].content[8] "clear_state | guard { input title_src | summary title_s; }"
+ilscript[0].content[9] "input attributes_src | passthrough attributes_src"
+ilscript[0].content[10] "input debug_src | passthrough debug_src"
+ilscript[0].content[11] "input product2_src | passthrough product2_src"
+ilscript[0].content[12] "input product3_src | passthrough product3_src"
+ilscript[0].content[13] "input product_src | passthrough product_src"
+ilscript[0].content[14] "input title_src | passthrough title_src" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/index-info.cfg b/config-model/src/test/derived/advanced/index-info.cfg
new file mode 100644
index 00000000000..1bb68110dae
--- /dev/null
+++ b/config-model/src/test/derived/advanced/index-info.cfg
@@ -0,0 +1,97 @@
+indexinfo[0].name "advanced"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "debug_src"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "attributes_src"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "location_str"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "title_src"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "product_src"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "product2_src"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "product3_src"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "attributes"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "attributes"
+indexinfo[0].command[10].command "lowercase"
+indexinfo[0].command[11].indexname "attributes"
+indexinfo[0].command[11].command "normalize"
+indexinfo[0].command[12].indexname "debug"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "debug"
+indexinfo[0].command[13].command "lowercase"
+indexinfo[0].command[14].indexname "debug"
+indexinfo[0].command[14].command "normalize"
+indexinfo[0].command[15].indexname "location"
+indexinfo[0].command[15].command "default-position"
+indexinfo[0].command[16].indexname "location"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "location.distance"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "location.distance"
+indexinfo[0].command[18].command "numerical"
+indexinfo[0].command[19].indexname "location.position"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "location.position"
+indexinfo[0].command[20].command "multivalue"
+indexinfo[0].command[21].indexname "location_zcurve"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "location_zcurve"
+indexinfo[0].command[22].command "attribute"
+indexinfo[0].command[23].indexname "location_zcurve"
+indexinfo[0].command[23].command "fast-search"
+indexinfo[0].command[24].indexname "location_zcurve"
+indexinfo[0].command[24].command "numerical"
+indexinfo[0].command[25].indexname "mysummary"
+indexinfo[0].command[25].command "index"
+indexinfo[0].command[26].indexname "product"
+indexinfo[0].command[26].command "index"
+indexinfo[0].command[27].indexname "product"
+indexinfo[0].command[27].command "lowercase"
+indexinfo[0].command[28].indexname "product"
+indexinfo[0].command[28].command "stem:SHORTEST"
+indexinfo[0].command[29].indexname "product2"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "product2"
+indexinfo[0].command[30].command "lowercase"
+indexinfo[0].command[31].indexname "product2"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "product3"
+indexinfo[0].command[32].command "index"
+indexinfo[0].command[33].indexname "product3"
+indexinfo[0].command[33].command "lowercase"
+indexinfo[0].command[34].indexname "product3"
+indexinfo[0].command[34].command "stem:SHORTEST"
+indexinfo[0].command[35].indexname "rankfeatures"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "summaryfeatures"
+indexinfo[0].command[36].command "index"
+indexinfo[0].command[37].indexname "title"
+indexinfo[0].command[37].command "index"
+indexinfo[0].command[38].indexname "titleabstract"
+indexinfo[0].command[38].command "index"
+indexinfo[0].command[39].indexname "default"
+indexinfo[0].command[39].command "index"
+indexinfo[0].command[40].indexname "title"
+indexinfo[0].command[40].command "lowercase"
+indexinfo[0].command[41].indexname "titleabstract"
+indexinfo[0].command[41].command "lowercase"
+indexinfo[0].command[42].indexname "default"
+indexinfo[0].command[42].command "lowercase"
+indexinfo[0].command[43].indexname "title"
+indexinfo[0].command[43].command "normalize"
+indexinfo[0].command[44].indexname "titleabstract"
+indexinfo[0].command[44].command "normalize"
+indexinfo[0].command[45].indexname "default"
+indexinfo[0].command[45].command "normalize"
+indexinfo[0].command[46].indexname "title_s"
+indexinfo[0].command[46].command "index"
+indexinfo[0].alias[0].alias "headline"
+indexinfo[0].alias[0].indexname "title" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/rank-profiles.cfg b/config-model/src/test/derived/advanced/rank-profiles.cfg
new file mode 100644
index 00000000000..779ee927952
--- /dev/null
+++ b/config-model/src/test/derived/advanced/rank-profiles.cfg
@@ -0,0 +1,18 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[0].fef.property[0].value "expdecay(100,12.50)"
+rankprofile[0].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[0].fef.property[1].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[2].name "nativeProximity.proximityTable.title"
+rankprofile[0].fef.property[2].value "expdecay(5000,3)"
+rankprofile[0].fef.property[3].name "nativeProximity.reverseProximityTable.title"
+rankprofile[0].fef.property[3].value "expdecay(3000,3)"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/summary.cfg b/config-model/src/test/derived/advanced/summary.cfg
new file mode 100644
index 00000000000..529bebd431b
--- /dev/null
+++ b/config-model/src/test/derived/advanced/summary.cfg
@@ -0,0 +1,33 @@
+defaultsummaryid 1271952241
+classes[0].id 1271952241
+classes[0].name "default"
+classes[0].fields[0].name "debug"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "attributes"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "title_s"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "product"
+classes[0].fields[3].type "longstring"
+classes[0].fields[4].name "product3"
+classes[0].fields[4].type "longstring"
+classes[0].fields[5].name "location.position"
+classes[0].fields[5].type "xmlstring"
+classes[0].fields[6].name "location.distance"
+classes[0].fields[6].type "integer"
+classes[0].fields[7].name "mysummary"
+classes[0].fields[7].type "longstring"
+classes[0].fields[8].name "rankfeatures"
+classes[0].fields[8].type "featuredata"
+classes[0].fields[9].name "summaryfeatures"
+classes[0].fields[9].type "featuredata"
+classes[0].fields[10].name "documentid"
+classes[0].fields[10].type "longstring"
+classes[1].id 472092010
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "location_zcurve"
+classes[1].fields[0].type "int64"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].type "featuredata"
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/advanced/summarymap.cfg b/config-model/src/test/derived/advanced/summarymap.cfg
new file mode 100644
index 00000000000..ee1a491f8c8
--- /dev/null
+++ b/config-model/src/test/derived/advanced/summarymap.cfg
@@ -0,0 +1,16 @@
+defaultoutputclass -1
+override[0].field "location.position"
+override[0].command "positions"
+override[0].arguments "location_zcurve"
+override[1].field "location.distance"
+override[1].command "absdist"
+override[1].arguments "location_zcurve"
+override[2].field "rankfeatures"
+override[2].command "rankfeatures"
+override[2].arguments ""
+override[3].field "summaryfeatures"
+override[3].command "summaryfeatures"
+override[3].arguments ""
+override[4].field "location_zcurve"
+override[4].command "attribute"
+override[4].arguments "location_zcurve" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/annotationsimplicitstruct.sd b/config-model/src/test/derived/annotationsimplicitstruct/annotationsimplicitstruct.sd
new file mode 100755
index 00000000000..37c88f58b6b
--- /dev/null
+++ b/config-model/src/test/derived/annotationsimplicitstruct/annotationsimplicitstruct.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsimplicitstruct {
+
+ document annotationsimplicitstruct {
+
+ annotation banana {
+ field brand type string { }
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg b/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg
new file mode 100755
index 00000000000..db85eb92e9b
--- /dev/null
+++ b/config-model/src/test/derived/annotationsimplicitstruct/documentmanager.cfg
@@ -0,0 +1,49 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 517946310
+datatype[1].structtype[0].name "annotation.banana"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "brand"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id -364910881
+datatype[2].structtype[0].name "annotationsimplicitstruct.header"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "rankfeatures"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "summaryfeatures"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[3].id -1503592268
+datatype[3].structtype[0].name "annotationsimplicitstruct.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[4].id -2099544992
+datatype[4].documenttype[0].name "annotationsimplicitstruct"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct -364910881
+datatype[4].documenttype[0].bodystruct -1503592268
+annotationtype[0].id -269517759
+annotationtype[0].name "banana"
+annotationtype[0].datatype 517946310
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg b/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg
new file mode 100644
index 00000000000..b49e52092c2
--- /dev/null
+++ b/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg
@@ -0,0 +1,2 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationsimplicitstruct" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/index-info.cfg b/config-model/src/test/derived/annotationsimplicitstruct/index-info.cfg
new file mode 100755
index 00000000000..30ee2e6333b
--- /dev/null
+++ b/config-model/src/test/derived/annotationsimplicitstruct/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationsimplicitstruct"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsinheritance/annotationsinheritance.sd b/config-model/src/test/derived/annotationsinheritance/annotationsinheritance.sd
new file mode 100755
index 00000000000..8316e6b7fa5
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance/annotationsinheritance.sd
@@ -0,0 +1,39 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsinheritance {
+
+ document annotationsinheritance {
+
+ annotation fruit {
+ }
+
+ annotation banana inherits fruit {
+ field brand type string { }
+ }
+
+ annotation vehicle {
+ field numwheels type int { }
+ }
+
+ annotation car inherits vehicle {
+ field color type string { }
+ }
+
+ annotation intern inherits employee {
+ field enddate type long { }
+ }
+
+ annotation employee inherits worker {
+ field employeeid type int { }
+ }
+
+ annotation worker inherits person {
+ }
+
+ annotation person {
+ field name type string { }
+ }
+
+ }
+
+
+}
diff --git a/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg b/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg
new file mode 100755
index 00000000000..11e179ec748
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance/documentmanager.cfg
@@ -0,0 +1,135 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 517946310
+datatype[1].structtype[0].name "annotation.banana"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "brand"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id -1339036621
+datatype[2].structtype[0].name "annotation.intern"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "enddate"
+datatype[2].structtype[0].field[0].datatype 4
+datatype[2].structtype[0].inherits[0].name "annotation.employee"
+datatype[2].structtype[0].inherits[0].version 0
+datatype[3].id 249059607
+datatype[3].structtype[0].name "annotation.car"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "color"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].inherits[0].name "annotation.vehicle"
+datatype[3].structtype[0].inherits[0].version 0
+datatype[4].id -1466283082
+datatype[4].structtype[0].name "annotation.person"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[4].structtype[0].field[0].name "name"
+datatype[4].structtype[0].field[0].datatype 2
+datatype[5].id -858216177
+datatype[5].structtype[0].name "annotation.employee"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "employeeid"
+datatype[5].structtype[0].field[0].datatype 0
+datatype[5].structtype[0].inherits[0].name "annotation.worker"
+datatype[5].structtype[0].inherits[0].version 0
+datatype[6].id -1874092641
+datatype[6].structtype[0].name "annotation.worker"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[6].structtype[0].inherits[0].name "annotation.person"
+datatype[6].structtype[0].inherits[0].version 0
+datatype[7].id -1047410193
+datatype[7].structtype[0].name "annotation.vehicle"
+datatype[7].structtype[0].version 0
+datatype[7].structtype[0].compresstype NONE
+datatype[7].structtype[0].compresslevel 0
+datatype[7].structtype[0].compressthreshold 95
+datatype[7].structtype[0].compressminsize 800
+datatype[7].structtype[0].field[0].name "numwheels"
+datatype[7].structtype[0].field[0].datatype 0
+datatype[8].id -1406250281
+datatype[8].structtype[0].name "annotationsinheritance.header"
+datatype[8].structtype[0].version 0
+datatype[8].structtype[0].compresstype NONE
+datatype[8].structtype[0].compresslevel 0
+datatype[8].structtype[0].compressthreshold 95
+datatype[8].structtype[0].compressminsize 800
+datatype[8].structtype[0].field[0].name "rankfeatures"
+datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[1].name "summaryfeatures"
+datatype[8].structtype[0].field[1].datatype 2
+datatype[9].id 1181354668
+datatype[9].structtype[0].name "annotationsinheritance.body"
+datatype[9].structtype[0].version 0
+datatype[9].structtype[0].compresstype NONE
+datatype[9].structtype[0].compresslevel 0
+datatype[9].structtype[0].compressthreshold 95
+datatype[9].structtype[0].compressminsize 800
+datatype[10].id -748546200
+datatype[10].documenttype[0].name "annotationsinheritance"
+datatype[10].documenttype[0].version 0
+datatype[10].documenttype[0].inherits[0].name "document"
+datatype[10].documenttype[0].inherits[0].version 0
+datatype[10].documenttype[0].headerstruct -1406250281
+datatype[10].documenttype[0].bodystruct 1181354668
+annotationtype[0].id -269517759
+annotationtype[0].name "banana"
+annotationtype[0].datatype 517946310
+annotationtype[0].inherits[0].id 877283632
+annotationtype[1].id 855102455
+annotationtype[1].name "intern"
+annotationtype[1].datatype -1339036621
+annotationtype[1].inherits[0].id 804106508
+annotationtype[2].id -973728295
+annotationtype[2].name "car"
+annotationtype[2].datatype 249059607
+annotationtype[2].inherits[0].id 290814930
+annotationtype[3].id 877283632
+annotationtype[3].name "fruit"
+annotationtype[3].datatype -1
+annotationtype[4].id 609952424
+annotationtype[4].name "person"
+annotationtype[4].datatype -1466283082
+annotationtype[5].id 804106508
+annotationtype[5].name "employee"
+annotationtype[5].datatype -858216177
+annotationtype[5].inherits[0].id 881692980
+annotationtype[6].id 881692980
+annotationtype[6].name "worker"
+annotationtype[6].datatype -1874092641
+annotationtype[6].inherits[0].id 609952424
+annotationtype[7].id 290814930
+annotationtype[7].name "vehicle"
+annotationtype[7].datatype -1047410193
diff --git a/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg b/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg
new file mode 100755
index 00000000000..a6b1aabfb47
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg
@@ -0,0 +1,2 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationsinheritance" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsinheritance/index-info.cfg b/config-model/src/test/derived/annotationsinheritance/index-info.cfg
new file mode 100755
index 00000000000..ae1a6462229
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationsinheritance"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsinheritance2/annotationsinheritance2.sd b/config-model/src/test/derived/annotationsinheritance2/annotationsinheritance2.sd
new file mode 100755
index 00000000000..441ea3c4f65
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance2/annotationsinheritance2.sd
@@ -0,0 +1,32 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsinheritance2 {
+
+ document annotationsinheritance2 {
+
+ annotation g {
+ field gfoo type string { }
+ }
+
+ annotation f {
+ }
+
+ annotation e inherits d {
+ }
+
+
+ annotation d inherits c {
+ }
+
+ annotation c {
+ field cfoo type int { }
+ }
+
+ annotation b inherits a {
+ }
+
+ annotation a {
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg b/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg
new file mode 100755
index 00000000000..e49d0753296
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance2/documentmanager.cfg
@@ -0,0 +1,97 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1443831334
+datatype[1].structtype[0].name "annotation.c"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "cfoo"
+datatype[1].structtype[0].field[0].datatype 0
+datatype[2].id 1443832295
+datatype[2].structtype[0].name "annotation.d"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].inherits[0].name "annotation.c"
+datatype[2].structtype[0].inherits[0].version 0
+datatype[3].id 1443833256
+datatype[3].structtype[0].name "annotation.e"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].inherits[0].name "annotation.d"
+datatype[3].structtype[0].inherits[0].version 0
+datatype[4].id 1443835178
+datatype[4].structtype[0].name "annotation.g"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[4].structtype[0].field[0].name "gfoo"
+datatype[4].structtype[0].field[0].datatype 2
+datatype[5].id 424382193
+datatype[5].structtype[0].name "annotationsinheritance2.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "rankfeatures"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[1].name "summaryfeatures"
+datatype[5].structtype[0].field[1].datatype 2
+datatype[6].id 1375438150
+datatype[6].structtype[0].name "annotationsinheritance2.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id -1730091890
+datatype[7].documenttype[0].name "annotationsinheritance2"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].headerstruct 424382193
+datatype[7].documenttype[0].bodystruct 1375438150
+annotationtype[0].id 1769416289
+annotationtype[0].name "a"
+annotationtype[0].datatype -1
+annotationtype[1].id 1966167951
+annotationtype[1].name "b"
+annotationtype[1].datatype -1
+annotationtype[1].inherits[0].id 1769416289
+annotationtype[2].id 1082875699
+annotationtype[2].name "c"
+annotationtype[2].datatype 1443831334
+annotationtype[3].id 383816109
+annotationtype[3].name "d"
+annotationtype[3].datatype 1443832295
+annotationtype[3].inherits[0].id 1082875699
+annotationtype[4].id -398332878
+annotationtype[4].name "e"
+annotationtype[4].datatype 1443833256
+annotationtype[4].inherits[0].id 383816109
+annotationtype[5].id 422169831
+annotationtype[5].name "f"
+annotationtype[5].datatype -1
+annotationtype[6].id 907314269
+annotationtype[6].name "g"
+annotationtype[6].datatype 1443835178
diff --git a/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg b/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg
new file mode 100755
index 00000000000..2717f4ab7e5
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg
@@ -0,0 +1,2 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationsinheritance2" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsinheritance2/index-info.cfg b/config-model/src/test/derived/annotationsinheritance2/index-info.cfg
new file mode 100755
index 00000000000..5c41ffe1bb7
--- /dev/null
+++ b/config-model/src/test/derived/annotationsinheritance2/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationsinheritance2"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsoutsideofdocument/annotationsoutsideofdocument.sd b/config-model/src/test/derived/annotationsoutsideofdocument/annotationsoutsideofdocument.sd
new file mode 100644
index 00000000000..6b46ec6c86e
--- /dev/null
+++ b/config-model/src/test/derived/annotationsoutsideofdocument/annotationsoutsideofdocument.sd
@@ -0,0 +1,11 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsoutsideofdocument {
+
+# (will fail)
+
+annotation foo {}
+
+document {
+
+}
+}
diff --git a/config-model/src/test/derived/annotationspolymorphy/annotationspolymorphy.sd b/config-model/src/test/derived/annotationspolymorphy/annotationspolymorphy.sd
new file mode 100644
index 00000000000..64fd62bc58b
--- /dev/null
+++ b/config-model/src/test/derived/annotationspolymorphy/annotationspolymorphy.sd
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationspolymorphy {
+
+ document annotationspolymorphy {
+
+ annotation super {
+ }
+ annotation sub inherits super {
+ }
+ annotation blah {
+ field a type annotationreference<super> {}
+ }
+
+ }
+}
diff --git a/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg b/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg
new file mode 100755
index 00000000000..d612a3b168b
--- /dev/null
+++ b/config-model/src/test/derived/annotationspolymorphy/documentmanager.cfg
@@ -0,0 +1,58 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -2014701853
+datatype[1].annotationreftype[0].annotation "super"
+datatype[2].id -888007918
+datatype[2].structtype[0].name "annotation.blah"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "a"
+datatype[2].structtype[0].field[0].datatype -2014701853
+datatype[3].id -1552577796
+datatype[3].structtype[0].name "annotationspolymorphy.header"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "rankfeatures"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[1].name "summaryfeatures"
+datatype[3].structtype[0].field[1].datatype 2
+datatype[4].id -570750959
+datatype[4].structtype[0].name "annotationspolymorphy.body"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[5].id -1383624989
+datatype[5].documenttype[0].name "annotationspolymorphy"
+datatype[5].documenttype[0].version 0
+datatype[5].documenttype[0].inherits[0].name "document"
+datatype[5].documenttype[0].inherits[0].version 0
+datatype[5].documenttype[0].headerstruct -1552577796
+datatype[5].documenttype[0].bodystruct -570750959
+annotationtype[0].id 668095690
+annotationtype[0].name "super"
+annotationtype[0].datatype -1
+annotationtype[1].id 119710016
+annotationtype[1].name "sub"
+annotationtype[1].datatype -1
+annotationtype[1].inherits[0].id 668095690
+annotationtype[2].id -1793776935
+annotationtype[2].name "blah"
+annotationtype[2].datatype -888007918
diff --git a/config-model/src/test/derived/annotationspolymorphy/index-info.cfg b/config-model/src/test/derived/annotationspolymorphy/index-info.cfg
new file mode 100755
index 00000000000..67e43f8036f
--- /dev/null
+++ b/config-model/src/test/derived/annotationspolymorphy/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationspolymorphy"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsreference/annotationsreference.sd b/config-model/src/test/derived/annotationsreference/annotationsreference.sd
new file mode 100755
index 00000000000..568a6a1f191
--- /dev/null
+++ b/config-model/src/test/derived/annotationsreference/annotationsreference.sd
@@ -0,0 +1,26 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsreference {
+
+ document annotationsreference {
+
+ annotation banana {
+ field brand type string { }
+ }
+
+ annotation food {
+ field what type annotationreference<banana> { }
+ }
+
+ annotation cyclic {
+ field blah type annotationreference<cyclic> { }
+ }
+
+ annotation a {
+ field foo type annotationreference<b> { }
+ }
+
+ annotation b {
+ }
+
+ }
+}
diff --git a/config-model/src/test/derived/annotationsreference/documentmanager.cfg b/config-model/src/test/derived/annotationsreference/documentmanager.cfg
new file mode 100755
index 00000000000..3218262b54d
--- /dev/null
+++ b/config-model/src/test/derived/annotationsreference/documentmanager.cfg
@@ -0,0 +1,94 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 517946310
+datatype[1].structtype[0].name "annotation.banana"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "brand"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 400622300
+datatype[2].annotationreftype[0].annotation "b"
+datatype[3].id 1443829412
+datatype[3].structtype[0].name "annotation.a"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "foo"
+datatype[3].structtype[0].field[0].datatype 400622300
+datatype[4].id -808460615
+datatype[4].annotationreftype[0].annotation "banana"
+datatype[5].id -770307521
+datatype[5].structtype[0].name "annotation.food"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "what"
+datatype[5].structtype[0].field[0].datatype -808460615
+datatype[6].id 756306917
+datatype[6].annotationreftype[0].annotation "cyclic"
+datatype[7].id 1781099546
+datatype[7].structtype[0].name "annotation.cyclic"
+datatype[7].structtype[0].version 0
+datatype[7].structtype[0].compresstype NONE
+datatype[7].structtype[0].compresslevel 0
+datatype[7].structtype[0].compressthreshold 95
+datatype[7].structtype[0].compressminsize 800
+datatype[7].structtype[0].field[0].name "blah"
+datatype[7].structtype[0].field[0].datatype 756306917
+datatype[8].id 571255414
+datatype[8].structtype[0].name "annotationsreference.header"
+datatype[8].structtype[0].version 0
+datatype[8].structtype[0].compresstype NONE
+datatype[8].structtype[0].compresslevel 0
+datatype[8].structtype[0].compressthreshold 95
+datatype[8].structtype[0].compressminsize 800
+datatype[8].structtype[0].field[0].name "rankfeatures"
+datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[1].name "summaryfeatures"
+datatype[8].structtype[0].field[1].datatype 2
+datatype[9].id 1692909067
+datatype[9].structtype[0].name "annotationsreference.body"
+datatype[9].structtype[0].version 0
+datatype[9].structtype[0].compresstype NONE
+datatype[9].structtype[0].compresslevel 0
+datatype[9].structtype[0].compressthreshold 95
+datatype[9].structtype[0].compressminsize 800
+datatype[10].id -1448377175
+datatype[10].documenttype[0].name "annotationsreference"
+datatype[10].documenttype[0].version 0
+datatype[10].documenttype[0].inherits[0].name "document"
+datatype[10].documenttype[0].inherits[0].version 0
+datatype[10].documenttype[0].headerstruct 571255414
+datatype[10].documenttype[0].bodystruct 1692909067
+annotationtype[0].id -269517759
+annotationtype[0].name "banana"
+annotationtype[0].datatype 517946310
+annotationtype[1].id 1769416289
+annotationtype[1].name "a"
+annotationtype[1].datatype 1443829412
+annotationtype[2].id 1966167951
+annotationtype[2].name "b"
+annotationtype[2].datatype -1
+annotationtype[3].id 1918102169
+annotationtype[3].name "food"
+annotationtype[3].datatype -770307521
+annotationtype[4].id -1569831750
+annotationtype[4].name "cyclic"
+annotationtype[4].datatype 1781099546
diff --git a/config-model/src/test/derived/annotationsreference/ilscripts.cfg b/config-model/src/test/derived/annotationsreference/ilscripts.cfg
new file mode 100755
index 00000000000..2297994c727
--- /dev/null
+++ b/config-model/src/test/derived/annotationsreference/ilscripts.cfg
@@ -0,0 +1,2 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationsreference" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsreference/index-info.cfg b/config-model/src/test/derived/annotationsreference/index-info.cfg
new file mode 100755
index 00000000000..0dfc76861e1
--- /dev/null
+++ b/config-model/src/test/derived/annotationsreference/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationsreference"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsreference2/annotationsreference2.sd b/config-model/src/test/derived/annotationsreference2/annotationsreference2.sd
new file mode 100644
index 00000000000..5b4a2eb0562
--- /dev/null
+++ b/config-model/src/test/derived/annotationsreference2/annotationsreference2.sd
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationreference2 {
+ document annotationreference2 {
+ annotation foo { }
+ annotation bar {
+ field baz type array<annotationreference<foo>> { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/annotationssimple/annotationssimple.sd b/config-model/src/test/derived/annotationssimple/annotationssimple.sd
new file mode 100755
index 00000000000..82bcd55b673
--- /dev/null
+++ b/config-model/src/test/derived/annotationssimple/annotationssimple.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationssimple {
+
+ document annotationssimple {
+ annotation banana { }
+ }
+
+}
diff --git a/config-model/src/test/derived/annotationssimple/documentmanager.cfg b/config-model/src/test/derived/annotationssimple/documentmanager.cfg
new file mode 100755
index 00000000000..54832bb97f9
--- /dev/null
+++ b/config-model/src/test/derived/annotationssimple/documentmanager.cfg
@@ -0,0 +1,40 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -1205708249
+datatype[1].structtype[0].name "annotationssimple.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "rankfeatures"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "summaryfeatures"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[2].id -682121732
+datatype[2].structtype[0].name "annotationssimple.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id -1584092648
+datatype[3].documenttype[0].name "annotationssimple"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -1205708249
+datatype[3].documenttype[0].bodystruct -682121732
+annotationtype[0].id -269517759
+annotationtype[0].name "banana"
+annotationtype[0].datatype -1
diff --git a/config-model/src/test/derived/annotationssimple/ilscripts.cfg b/config-model/src/test/derived/annotationssimple/ilscripts.cfg
new file mode 100644
index 00000000000..a234feff99d
--- /dev/null
+++ b/config-model/src/test/derived/annotationssimple/ilscripts.cfg
@@ -0,0 +1,2 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationssimple" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationssimple/index-info.cfg b/config-model/src/test/derived/annotationssimple/index-info.cfg
new file mode 100755
index 00000000000..84c18bc082f
--- /dev/null
+++ b/config-model/src/test/derived/annotationssimple/index-info.cfg
@@ -0,0 +1,9 @@
+indexinfo[0].name "annotationssimple"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "rankfeatures"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "summaryfeatures"
+indexinfo[0].command[3].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/annotationsstruct/annotationsstruct.sd b/config-model/src/test/derived/annotationsstruct/annotationsstruct.sd
new file mode 100644
index 00000000000..b4ba809d93b
--- /dev/null
+++ b/config-model/src/test/derived/annotationsstruct/annotationsstruct.sd
@@ -0,0 +1,11 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsstruct {
+ document annotationsstruct {
+ struct my_struct {
+ field my_structfield type string { }
+ }
+ annotation my_anno {
+ field my_annofield type my_struct { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/annotationsstruct/documentmanager.cfg b/config-model/src/test/derived/annotationsstruct/documentmanager.cfg
new file mode 100644
index 00000000000..f3c93b31285
--- /dev/null
+++ b/config-model/src/test/derived/annotationsstruct/documentmanager.cfg
@@ -0,0 +1,58 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1293792650
+datatype[1].structtype[0].name "my_struct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "my_structfield"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id -1080124700
+datatype[2].structtype[0].name "annotation.my_anno"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "my_annofield"
+datatype[2].structtype[0].field[0].datatype 1293792650
+datatype[3].id 1341437796
+datatype[3].structtype[0].name "annotationsstruct.header"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "rankfeatures"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[1].name "summaryfeatures"
+datatype[3].structtype[0].field[1].datatype 2
+datatype[4].id -1180029319
+datatype[4].structtype[0].name "annotationsstruct.body"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[5].id -263977093
+datatype[5].documenttype[0].name "annotationsstruct"
+datatype[5].documenttype[0].version 0
+datatype[5].documenttype[0].inherits[0].name "document"
+datatype[5].documenttype[0].inherits[0].version 0
+datatype[5].documenttype[0].headerstruct 1341437796
+datatype[5].documenttype[0].bodystruct -1180029319
+annotationtype[0].id -160036815
+annotationtype[0].name "my_anno"
+annotationtype[0].datatype -1080124700
diff --git a/config-model/src/test/derived/annotationsstructarray/annotationsstructarray.sd b/config-model/src/test/derived/annotationsstructarray/annotationsstructarray.sd
new file mode 100644
index 00000000000..e54aae45caa
--- /dev/null
+++ b/config-model/src/test/derived/annotationsstructarray/annotationsstructarray.sd
@@ -0,0 +1,11 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsstructarray {
+ document annotationsstructarray {
+ struct my_struct {
+ field my_structfield type string { }
+ }
+ annotation my_anno {
+ field my_annofield type array<my_struct> { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg b/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg
new file mode 100644
index 00000000000..01e3945fc2a
--- /dev/null
+++ b/config-model/src/test/derived/annotationsstructarray/documentmanager.cfg
@@ -0,0 +1,60 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1293792650
+datatype[1].structtype[0].name "my_struct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "my_structfield"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 754837689
+datatype[2].arraytype[0].datatype 1293792650
+datatype[3].id -1080124700
+datatype[3].structtype[0].name "annotation.my_anno"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "my_annofield"
+datatype[3].structtype[0].field[0].datatype 754837689
+datatype[4].id 94945597
+datatype[4].structtype[0].name "annotationsstructarray.header"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[4].structtype[0].field[0].name "rankfeatures"
+datatype[4].structtype[0].field[0].datatype 2
+datatype[4].structtype[0].field[1].name "summaryfeatures"
+datatype[4].structtype[0].field[1].datatype 2
+datatype[5].id 1616435858
+datatype[5].structtype[0].name "annotationsstructarray.body"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[6].id 1593733058
+datatype[6].documenttype[0].name "annotationsstructarray"
+datatype[6].documenttype[0].version 0
+datatype[6].documenttype[0].inherits[0].name "document"
+datatype[6].documenttype[0].inherits[0].version 0
+datatype[6].documenttype[0].headerstruct 94945597
+datatype[6].documenttype[0].bodystruct 1616435858
+annotationtype[0].id -160036815
+annotationtype[0].name "my_anno"
+annotationtype[0].datatype -1080124700
diff --git a/config-model/src/test/derived/arrays/arrays.sd b/config-model/src/test/derived/arrays/arrays.sd
new file mode 100644
index 00000000000..c5ce810bc0c
--- /dev/null
+++ b/config-model/src/test/derived/arrays/arrays.sd
@@ -0,0 +1,32 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search arrays {
+
+ document arrays {
+
+ field tags type array<string> {
+ indexing: summary | index
+ }
+
+ field ratings type int[] {
+ indexing: summary | index
+ }
+
+ field a type string {
+ indexing: index
+ }
+
+ field b type array<string> {
+ indexing: index | attribute
+ }
+
+ field c type weightedset<string> {
+ indexing: summary | index
+ }
+
+ }
+
+ fieldset default {
+ fields: a, b, c
+ }
+
+}
diff --git a/config-model/src/test/derived/arrays/documentmanager.cfg b/config-model/src/test/derived/arrays/documentmanager.cfg
new file mode 100644
index 00000000000..68506844b5d
--- /dev/null
+++ b/config-model/src/test/derived/arrays/documentmanager.cfg
@@ -0,0 +1,63 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -1486737430
+datatype[1].arraytype[0].datatype 2
+datatype[2].id -1245117006
+datatype[2].arraytype[0].datatype 0
+datatype[3].id 1328286588
+datatype[3].weightedsettype[0].datatype 2
+datatype[3].weightedsettype[0].createifnonexistant false
+datatype[3].weightedsettype[0].removeifzero false
+datatype[4].id 1081627459
+datatype[4].structtype[0].name "arrays.header"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[4].structtype[0].field[0].name "tags"
+datatype[4].structtype[0].field[0].datatype -1486737430
+datatype[4].structtype[0].field[1].name "ratings"
+datatype[4].structtype[0].field[1].datatype -1245117006
+datatype[4].structtype[0].field[2].name "a"
+datatype[4].structtype[0].field[2].datatype 2
+datatype[4].structtype[0].field[3].name "b"
+datatype[4].structtype[0].field[3].datatype -1486737430
+datatype[4].structtype[0].field[4].name "c"
+datatype[4].structtype[0].field[4].datatype 1328286588
+datatype[4].structtype[0].field[5].name "rankfeatures"
+datatype[4].structtype[0].field[5].datatype 2
+datatype[4].structtype[0].field[6].name "summaryfeatures"
+datatype[4].structtype[0].field[6].datatype 2
+datatype[5].id -1747896808
+datatype[5].structtype[0].name "arrays.body"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[6].id -1292863364
+datatype[6].documenttype[0].name "arrays"
+datatype[6].documenttype[0].version 0
+datatype[6].documenttype[0].inherits[0].name "document"
+datatype[6].documenttype[0].inherits[0].version 0
+datatype[6].documenttype[0].headerstruct 1081627459
+datatype[6].documenttype[0].bodystruct -1747896808
+datatype[6].documenttype[0].fieldsets{default}.fields[0] "a"
+datatype[6].documenttype[0].fieldsets{default}.fields[1] "b"
+datatype[6].documenttype[0].fieldsets{default}.fields[2] "c"
+datatype[6].documenttype[0].fieldsets{[document]}.fields[0] "a"
+datatype[6].documenttype[0].fieldsets{[document]}.fields[1] "b"
+datatype[6].documenttype[0].fieldsets{[document]}.fields[2] "c"
+datatype[6].documenttype[0].fieldsets{[document]}.fields[3] "ratings"
+datatype[6].documenttype[0].fieldsets{[document]}.fields[4] "tags"
diff --git a/config-model/src/test/derived/arrays/ilscripts.cfg b/config-model/src/test/derived/arrays/ilscripts.cfg
new file mode 100644
index 00000000000..d8fbe752676
--- /dev/null
+++ b/config-model/src/test/derived/arrays/ilscripts.cfg
@@ -0,0 +1,12 @@
+maxtermoccurrences 100
+ilscript[0].doctype "arrays"
+ilscript[0].docfield[0] "tags"
+ilscript[0].docfield[1] "ratings"
+ilscript[0].docfield[2] "a"
+ilscript[0].docfield[3] "b"
+ilscript[0].docfield[4] "c"
+ilscript[0].content[0] "clear_state | guard { input tags | for_each { tokenize normalize stem:\"SHORTEST\" } | summary tags | index tags; }"
+ilscript[0].content[1] "clear_state | guard { input ratings | summary ratings | attribute ratings; }"
+ilscript[0].content[2] "clear_state | guard { input a | tokenize normalize stem:\"SHORTEST\" | index a; }"
+ilscript[0].content[3] "clear_state | guard { input b | for_each { tokenize normalize stem:\"SHORTEST\" } | index b | attribute b; }"
+ilscript[0].content[4] "clear_state | guard { input c | for_each { tokenize normalize stem:\"SHORTEST\" } | summary c | index c; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/arrays/index-info.cfg b/config-model/src/test/derived/arrays/index-info.cfg
new file mode 100644
index 00000000000..f5f65700d89
--- /dev/null
+++ b/config-model/src/test/derived/arrays/index-info.cfg
@@ -0,0 +1,63 @@
+indexinfo[].name "arrays"
+indexinfo[].command[].indexname "sddocname"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "sddocname"
+indexinfo[].command[].command "word"
+indexinfo[].command[].indexname "tags"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "tags"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "tags"
+indexinfo[].command[].command "multivalue"
+indexinfo[].command[].indexname "tags"
+indexinfo[].command[].command "stem:SHORTEST"
+indexinfo[].command[].indexname "tags"
+indexinfo[].command[].command "normalize"
+indexinfo[].command[].indexname "ratings"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "ratings"
+indexinfo[].command[].command "multivalue"
+indexinfo[].command[].indexname "ratings"
+indexinfo[].command[].command "attribute"
+indexinfo[].command[].indexname "default"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "default"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "default"
+indexinfo[].command[].command "stem:SHORTEST"
+indexinfo[].command[].indexname "default"
+indexinfo[].command[].command "normalize"
+indexinfo[].command[].indexname "default"
+indexinfo[].command[].command "multivalue"
+indexinfo[].command[].indexname "a"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "a"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "a"
+indexinfo[].command[].command "stem:SHORTEST"
+indexinfo[].command[].indexname "a"
+indexinfo[].command[].command "normalize"
+indexinfo[].command[].indexname "b"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "b"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "b"
+indexinfo[].command[].command "multivalue"
+indexinfo[].command[].indexname "b"
+indexinfo[].command[].command "stem:SHORTEST"
+indexinfo[].command[].indexname "b"
+indexinfo[].command[].command "normalize"
+indexinfo[].command[].indexname "c"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "c"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "c"
+indexinfo[].command[].command "multivalue"
+indexinfo[].command[].indexname "c"
+indexinfo[].command[].command "stem:SHORTEST"
+indexinfo[].command[].indexname "c"
+indexinfo[].command[].command "normalize"
+indexinfo[].command[].indexname "rankfeatures"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "summaryfeatures"
+indexinfo[].command[].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/attributeprefetch.sd b/config-model/src/test/derived/attributeprefetch/attributeprefetch.sd
new file mode 100644
index 00000000000..25804ba9728
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/attributeprefetch.sd
@@ -0,0 +1,86 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search prefetch {
+ document prefetch {
+ field singlebyte type byte {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field multibyte type array<byte> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field wsbyte type weightedset<byte> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field singleint type int {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field multiint type array<int> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field wsint type weightedset<int> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field singlelong type long {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field multilong type array<long> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field wslong type weightedset<long> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field singlefloat type float {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field multifloat type array<float> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field wsfloat type weightedset<float> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field singledouble type double {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field multidouble type array<double> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field wsdouble type weightedset<double> {
+ indexing: attribute
+ attribute: prefetch
+ }
+ field singlestring type string {
+ indexing: attribute
+ attribute: prefetch
+ match {
+ token
+ }
+ }
+ field multistring type array<string> {
+ indexing: attribute
+ attribute: prefetch
+ match {
+ token
+ }
+ }
+ field wsstring type weightedset<string> {
+ indexing: attribute
+ attribute: prefetch
+ match {
+ token
+ }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/attributeprefetch/attributes.cfg b/config-model/src/test/derived/attributeprefetch/attributes.cfg
new file mode 100644
index 00000000000..16c2d9e404e
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/attributes.cfg
@@ -0,0 +1,342 @@
+attribute[0].name "singlebyte"
+attribute[0].datatype INT8
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "multibyte"
+attribute[1].datatype INT8
+attribute[1].collectiontype ARRAY
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "wsbyte"
+attribute[2].datatype INT8
+attribute[2].collectiontype WEIGHTEDSET
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "singleint"
+attribute[3].datatype INT32
+attribute[3].collectiontype SINGLE
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "multiint"
+attribute[4].datatype INT32
+attribute[4].collectiontype ARRAY
+attribute[4].removeifzero false
+attribute[4].createifnonexistent false
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "wsint"
+attribute[5].datatype INT32
+attribute[5].collectiontype WEIGHTEDSET
+attribute[5].removeifzero false
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "singlelong"
+attribute[6].datatype INT64
+attribute[6].collectiontype SINGLE
+attribute[6].removeifzero false
+attribute[6].createifnonexistent false
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "multilong"
+attribute[7].datatype INT64
+attribute[7].collectiontype ARRAY
+attribute[7].removeifzero false
+attribute[7].createifnonexistent false
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "wslong"
+attribute[8].datatype INT64
+attribute[8].collectiontype WEIGHTEDSET
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch false
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype ""
+attribute[9].name "singlefloat"
+attribute[9].datatype FLOAT
+attribute[9].collectiontype SINGLE
+attribute[9].removeifzero false
+attribute[9].createifnonexistent false
+attribute[9].fastsearch false
+attribute[9].huge false
+attribute[9].sortascending true
+attribute[9].sortfunction UCA
+attribute[9].sortstrength PRIMARY
+attribute[9].sortlocale ""
+attribute[9].enablebitvectors false
+attribute[9].enableonlybitvector false
+attribute[9].fastaccess false
+attribute[9].arity 8
+attribute[9].lowerbound -9223372036854775808
+attribute[9].upperbound 9223372036854775807
+attribute[9].densepostinglistthreshold 0.4
+attribute[9].tensortype ""
+attribute[10].name "multifloat"
+attribute[10].datatype FLOAT
+attribute[10].collectiontype ARRAY
+attribute[10].removeifzero false
+attribute[10].createifnonexistent false
+attribute[10].fastsearch false
+attribute[10].huge false
+attribute[10].sortascending true
+attribute[10].sortfunction UCA
+attribute[10].sortstrength PRIMARY
+attribute[10].sortlocale ""
+attribute[10].enablebitvectors false
+attribute[10].enableonlybitvector false
+attribute[10].fastaccess false
+attribute[10].arity 8
+attribute[10].lowerbound -9223372036854775808
+attribute[10].upperbound 9223372036854775807
+attribute[10].densepostinglistthreshold 0.4
+attribute[10].tensortype ""
+attribute[11].name "wsfloat"
+attribute[11].datatype FLOAT
+attribute[11].collectiontype WEIGHTEDSET
+attribute[11].removeifzero false
+attribute[11].createifnonexistent false
+attribute[11].fastsearch false
+attribute[11].huge false
+attribute[11].sortascending true
+attribute[11].sortfunction UCA
+attribute[11].sortstrength PRIMARY
+attribute[11].sortlocale ""
+attribute[11].enablebitvectors false
+attribute[11].enableonlybitvector false
+attribute[11].fastaccess false
+attribute[11].arity 8
+attribute[11].lowerbound -9223372036854775808
+attribute[11].upperbound 9223372036854775807
+attribute[11].densepostinglistthreshold 0.4
+attribute[11].tensortype ""
+attribute[12].name "singledouble"
+attribute[12].datatype DOUBLE
+attribute[12].collectiontype SINGLE
+attribute[12].removeifzero false
+attribute[12].createifnonexistent false
+attribute[12].fastsearch false
+attribute[12].huge false
+attribute[12].sortascending true
+attribute[12].sortfunction UCA
+attribute[12].sortstrength PRIMARY
+attribute[12].sortlocale ""
+attribute[12].enablebitvectors false
+attribute[12].enableonlybitvector false
+attribute[12].fastaccess false
+attribute[12].arity 8
+attribute[12].lowerbound -9223372036854775808
+attribute[12].upperbound 9223372036854775807
+attribute[12].densepostinglistthreshold 0.4
+attribute[12].tensortype ""
+attribute[13].name "multidouble"
+attribute[13].datatype DOUBLE
+attribute[13].collectiontype ARRAY
+attribute[13].removeifzero false
+attribute[13].createifnonexistent false
+attribute[13].fastsearch false
+attribute[13].huge false
+attribute[13].sortascending true
+attribute[13].sortfunction UCA
+attribute[13].sortstrength PRIMARY
+attribute[13].sortlocale ""
+attribute[13].enablebitvectors false
+attribute[13].enableonlybitvector false
+attribute[13].fastaccess false
+attribute[13].arity 8
+attribute[13].lowerbound -9223372036854775808
+attribute[13].upperbound 9223372036854775807
+attribute[13].densepostinglistthreshold 0.4
+attribute[13].tensortype ""
+attribute[14].name "wsdouble"
+attribute[14].datatype DOUBLE
+attribute[14].collectiontype WEIGHTEDSET
+attribute[14].removeifzero false
+attribute[14].createifnonexistent false
+attribute[14].fastsearch false
+attribute[14].huge false
+attribute[14].sortascending true
+attribute[14].sortfunction UCA
+attribute[14].sortstrength PRIMARY
+attribute[14].sortlocale ""
+attribute[14].enablebitvectors false
+attribute[14].enableonlybitvector false
+attribute[14].fastaccess false
+attribute[14].arity 8
+attribute[14].lowerbound -9223372036854775808
+attribute[14].upperbound 9223372036854775807
+attribute[14].densepostinglistthreshold 0.4
+attribute[14].tensortype ""
+attribute[15].name "singlestring"
+attribute[15].datatype STRING
+attribute[15].collectiontype SINGLE
+attribute[15].removeifzero false
+attribute[15].createifnonexistent false
+attribute[15].fastsearch false
+attribute[15].huge false
+attribute[15].sortascending true
+attribute[15].sortfunction UCA
+attribute[15].sortstrength PRIMARY
+attribute[15].sortlocale ""
+attribute[15].enablebitvectors false
+attribute[15].enableonlybitvector false
+attribute[15].fastaccess false
+attribute[15].arity 8
+attribute[15].lowerbound -9223372036854775808
+attribute[15].upperbound 9223372036854775807
+attribute[15].densepostinglistthreshold 0.4
+attribute[15].tensortype ""
+attribute[16].name "multistring"
+attribute[16].datatype STRING
+attribute[16].collectiontype ARRAY
+attribute[16].removeifzero false
+attribute[16].createifnonexistent false
+attribute[16].fastsearch false
+attribute[16].huge false
+attribute[16].sortascending true
+attribute[16].sortfunction UCA
+attribute[16].sortstrength PRIMARY
+attribute[16].sortlocale ""
+attribute[16].enablebitvectors false
+attribute[16].enableonlybitvector false
+attribute[16].fastaccess false
+attribute[16].arity 8
+attribute[16].lowerbound -9223372036854775808
+attribute[16].upperbound 9223372036854775807
+attribute[16].densepostinglistthreshold 0.4
+attribute[16].tensortype ""
+attribute[17].name "wsstring"
+attribute[17].datatype STRING
+attribute[17].collectiontype WEIGHTEDSET
+attribute[17].removeifzero false
+attribute[17].createifnonexistent false
+attribute[17].fastsearch false
+attribute[17].huge false
+attribute[17].sortascending true
+attribute[17].sortfunction UCA
+attribute[17].sortstrength PRIMARY
+attribute[17].sortlocale ""
+attribute[17].enablebitvectors false
+attribute[17].enableonlybitvector false
+attribute[17].fastaccess false
+attribute[17].arity 8
+attribute[17].lowerbound -9223372036854775808
+attribute[17].upperbound 9223372036854775807
+attribute[17].densepostinglistthreshold 0.4
+attribute[17].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/documentmanager.cfg b/config-model/src/test/derived/attributeprefetch/documentmanager.cfg
new file mode 100644
index 00000000000..92558a62509
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/documentmanager.cfg
@@ -0,0 +1,127 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 49942803
+datatype[1].arraytype[0].datatype 16
+datatype[2].id -1068914395
+datatype[2].weightedsettype[0].datatype 16
+datatype[2].weightedsettype[0].createifnonexistant false
+datatype[2].weightedsettype[0].removeifzero false
+datatype[3].id -1245117006
+datatype[3].arraytype[0].datatype 0
+datatype[4].id 519906144
+datatype[4].weightedsettype[0].datatype 0
+datatype[4].weightedsettype[0].createifnonexistant false
+datatype[4].weightedsettype[0].removeifzero false
+datatype[5].id 58874399
+datatype[5].arraytype[0].datatype 4
+datatype[6].id -1059982799
+datatype[6].weightedsettype[0].datatype 4
+datatype[6].weightedsettype[0].createifnonexistant false
+datatype[6].weightedsettype[0].removeifzero false
+datatype[7].id 1650586661
+datatype[7].arraytype[0].datatype 1
+datatype[8].id 1325751891
+datatype[8].weightedsettype[0].datatype 1
+datatype[8].weightedsettype[0].createifnonexistant false
+datatype[8].weightedsettype[0].removeifzero false
+datatype[9].id -2054976470
+datatype[9].arraytype[0].datatype 5
+datatype[10].id 760047548
+datatype[10].weightedsettype[0].datatype 5
+datatype[10].weightedsettype[0].createifnonexistant false
+datatype[10].weightedsettype[0].removeifzero false
+datatype[11].id -1486737430
+datatype[11].arraytype[0].datatype 2
+datatype[12].id 1328286588
+datatype[12].weightedsettype[0].datatype 2
+datatype[12].weightedsettype[0].createifnonexistant false
+datatype[12].weightedsettype[0].removeifzero false
+datatype[13].id -109105370
+datatype[13].structtype[0].name "prefetch.header"
+datatype[13].structtype[0].version 0
+datatype[13].structtype[0].compresstype NONE
+datatype[13].structtype[0].compresslevel 0
+datatype[13].structtype[0].compressthreshold 95
+datatype[13].structtype[0].compressminsize 800
+datatype[13].structtype[0].field[0].name "singlebyte"
+datatype[13].structtype[0].field[0].datatype 16
+datatype[13].structtype[0].field[1].name "multibyte"
+datatype[13].structtype[0].field[1].datatype 49942803
+datatype[13].structtype[0].field[2].name "wsbyte"
+datatype[13].structtype[0].field[2].datatype -1068914395
+datatype[13].structtype[0].field[3].name "singleint"
+datatype[13].structtype[0].field[3].datatype 0
+datatype[13].structtype[0].field[4].name "multiint"
+datatype[13].structtype[0].field[4].datatype -1245117006
+datatype[13].structtype[0].field[5].name "wsint"
+datatype[13].structtype[0].field[5].datatype 519906144
+datatype[13].structtype[0].field[6].name "singlelong"
+datatype[13].structtype[0].field[6].datatype 4
+datatype[13].structtype[0].field[7].name "multilong"
+datatype[13].structtype[0].field[7].datatype 58874399
+datatype[13].structtype[0].field[8].name "wslong"
+datatype[13].structtype[0].field[8].datatype -1059982799
+datatype[13].structtype[0].field[9].name "singlefloat"
+datatype[13].structtype[0].field[9].datatype 1
+datatype[13].structtype[0].field[10].name "multifloat"
+datatype[13].structtype[0].field[10].datatype 1650586661
+datatype[13].structtype[0].field[11].name "wsfloat"
+datatype[13].structtype[0].field[11].datatype 1325751891
+datatype[13].structtype[0].field[12].name "singledouble"
+datatype[13].structtype[0].field[12].datatype 5
+datatype[13].structtype[0].field[13].name "multidouble"
+datatype[13].structtype[0].field[13].datatype -2054976470
+datatype[13].structtype[0].field[14].name "wsdouble"
+datatype[13].structtype[0].field[14].datatype 760047548
+datatype[13].structtype[0].field[15].name "singlestring"
+datatype[13].structtype[0].field[15].datatype 2
+datatype[13].structtype[0].field[16].name "multistring"
+datatype[13].structtype[0].field[16].datatype -1486737430
+datatype[13].structtype[0].field[17].name "wsstring"
+datatype[13].structtype[0].field[17].datatype 1328286588
+datatype[13].structtype[0].field[18].name "rankfeatures"
+datatype[13].structtype[0].field[18].datatype 2
+datatype[13].structtype[0].field[19].name "summaryfeatures"
+datatype[13].structtype[0].field[19].datatype 2
+datatype[14].id 932425403
+datatype[14].structtype[0].name "prefetch.body"
+datatype[14].structtype[0].version 0
+datatype[14].structtype[0].compresstype NONE
+datatype[14].structtype[0].compresslevel 0
+datatype[14].structtype[0].compressthreshold 95
+datatype[14].structtype[0].compressminsize 800
+datatype[15].id -1458051591
+datatype[15].documenttype[0].name "prefetch"
+datatype[15].documenttype[0].version 0
+datatype[15].documenttype[0].inherits[0].name "document"
+datatype[15].documenttype[0].inherits[0].version 0
+datatype[15].documenttype[0].headerstruct -109105370
+datatype[15].documenttype[0].bodystruct 932425403
+datatype[15].documenttype[0].fieldsets{[document]}.fields[0] "multibyte"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[1] "multidouble"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[2] "multifloat"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[3] "multiint"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[4] "multilong"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[5] "multistring"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[6] "singlebyte"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[7] "singledouble"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[8] "singlefloat"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[9] "singleint"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[10] "singlelong"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[11] "singlestring"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[12] "wsbyte"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[13] "wsdouble"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[14] "wsfloat"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[15] "wsint"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[16] "wslong"
+datatype[15].documenttype[0].fieldsets{[document]}.fields[17] "wsstring"
diff --git a/config-model/src/test/derived/attributeprefetch/ilscripts.cfg b/config-model/src/test/derived/attributeprefetch/ilscripts.cfg
new file mode 100644
index 00000000000..201d529ce1d
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/ilscripts.cfg
@@ -0,0 +1,38 @@
+maxtermoccurrences 100
+ilscript[0].doctype "prefetch"
+ilscript[0].docfield[0] "singlebyte"
+ilscript[0].docfield[1] "multibyte"
+ilscript[0].docfield[2] "wsbyte"
+ilscript[0].docfield[3] "singleint"
+ilscript[0].docfield[4] "multiint"
+ilscript[0].docfield[5] "wsint"
+ilscript[0].docfield[6] "singlelong"
+ilscript[0].docfield[7] "multilong"
+ilscript[0].docfield[8] "wslong"
+ilscript[0].docfield[9] "singlefloat"
+ilscript[0].docfield[10] "multifloat"
+ilscript[0].docfield[11] "wsfloat"
+ilscript[0].docfield[12] "singledouble"
+ilscript[0].docfield[13] "multidouble"
+ilscript[0].docfield[14] "wsdouble"
+ilscript[0].docfield[15] "singlestring"
+ilscript[0].docfield[16] "multistring"
+ilscript[0].docfield[17] "wsstring"
+ilscript[0].content[0] "clear_state | guard { input singlebyte | attribute singlebyte; }"
+ilscript[0].content[1] "clear_state | guard { input multibyte | attribute multibyte; }"
+ilscript[0].content[2] "clear_state | guard { input wsbyte | attribute wsbyte; }"
+ilscript[0].content[3] "clear_state | guard { input singleint | attribute singleint; }"
+ilscript[0].content[4] "clear_state | guard { input multiint | attribute multiint; }"
+ilscript[0].content[5] "clear_state | guard { input wsint | attribute wsint; }"
+ilscript[0].content[6] "clear_state | guard { input singlelong | attribute singlelong; }"
+ilscript[0].content[7] "clear_state | guard { input multilong | attribute multilong; }"
+ilscript[0].content[8] "clear_state | guard { input wslong | attribute wslong; }"
+ilscript[0].content[9] "clear_state | guard { input singlefloat | attribute singlefloat; }"
+ilscript[0].content[10] "clear_state | guard { input multifloat | attribute multifloat; }"
+ilscript[0].content[11] "clear_state | guard { input wsfloat | attribute wsfloat; }"
+ilscript[0].content[12] "clear_state | guard { input singledouble | attribute singledouble; }"
+ilscript[0].content[13] "clear_state | guard { input multidouble | attribute multidouble; }"
+ilscript[0].content[14] "clear_state | guard { input wsdouble | attribute wsdouble; }"
+ilscript[0].content[15] "clear_state | guard { input singlestring | attribute singlestring; }"
+ilscript[0].content[16] "clear_state | guard { input multistring | attribute multistring; }"
+ilscript[0].content[17] "clear_state | guard { input wsstring | attribute wsstring; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/index-info.cfg b/config-model/src/test/derived/attributeprefetch/index-info.cfg
new file mode 100644
index 00000000000..526195dffb9
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/index-info.cfg
@@ -0,0 +1,115 @@
+indexinfo[0].name "prefetch"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "singlebyte"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "singlebyte"
+indexinfo[0].command[3].command "attribute"
+indexinfo[0].command[4].indexname "singlebyte"
+indexinfo[0].command[4].command "numerical"
+indexinfo[0].command[5].indexname "multibyte"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "multibyte"
+indexinfo[0].command[6].command "multivalue"
+indexinfo[0].command[7].indexname "multibyte"
+indexinfo[0].command[7].command "attribute"
+indexinfo[0].command[8].indexname "wsbyte"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "wsbyte"
+indexinfo[0].command[9].command "multivalue"
+indexinfo[0].command[10].indexname "wsbyte"
+indexinfo[0].command[10].command "attribute"
+indexinfo[0].command[11].indexname "singleint"
+indexinfo[0].command[11].command "index"
+indexinfo[0].command[12].indexname "singleint"
+indexinfo[0].command[12].command "attribute"
+indexinfo[0].command[13].indexname "singleint"
+indexinfo[0].command[13].command "numerical"
+indexinfo[0].command[14].indexname "multiint"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "multiint"
+indexinfo[0].command[15].command "multivalue"
+indexinfo[0].command[16].indexname "multiint"
+indexinfo[0].command[16].command "attribute"
+indexinfo[0].command[17].indexname "wsint"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "wsint"
+indexinfo[0].command[18].command "multivalue"
+indexinfo[0].command[19].indexname "wsint"
+indexinfo[0].command[19].command "attribute"
+indexinfo[0].command[20].indexname "singlelong"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "singlelong"
+indexinfo[0].command[21].command "attribute"
+indexinfo[0].command[22].indexname "singlelong"
+indexinfo[0].command[22].command "numerical"
+indexinfo[0].command[23].indexname "multilong"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "multilong"
+indexinfo[0].command[24].command "multivalue"
+indexinfo[0].command[25].indexname "multilong"
+indexinfo[0].command[25].command "attribute"
+indexinfo[0].command[26].indexname "wslong"
+indexinfo[0].command[26].command "index"
+indexinfo[0].command[27].indexname "wslong"
+indexinfo[0].command[27].command "multivalue"
+indexinfo[0].command[28].indexname "wslong"
+indexinfo[0].command[28].command "attribute"
+indexinfo[0].command[29].indexname "singlefloat"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "singlefloat"
+indexinfo[0].command[30].command "attribute"
+indexinfo[0].command[31].indexname "singlefloat"
+indexinfo[0].command[31].command "numerical"
+indexinfo[0].command[32].indexname "multifloat"
+indexinfo[0].command[32].command "index"
+indexinfo[0].command[33].indexname "multifloat"
+indexinfo[0].command[33].command "multivalue"
+indexinfo[0].command[34].indexname "multifloat"
+indexinfo[0].command[34].command "attribute"
+indexinfo[0].command[35].indexname "wsfloat"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "wsfloat"
+indexinfo[0].command[36].command "multivalue"
+indexinfo[0].command[37].indexname "wsfloat"
+indexinfo[0].command[37].command "attribute"
+indexinfo[0].command[38].indexname "singledouble"
+indexinfo[0].command[38].command "index"
+indexinfo[0].command[39].indexname "singledouble"
+indexinfo[0].command[39].command "attribute"
+indexinfo[0].command[40].indexname "singledouble"
+indexinfo[0].command[40].command "numerical"
+indexinfo[0].command[41].indexname "multidouble"
+indexinfo[0].command[41].command "index"
+indexinfo[0].command[42].indexname "multidouble"
+indexinfo[0].command[42].command "multivalue"
+indexinfo[0].command[43].indexname "multidouble"
+indexinfo[0].command[43].command "attribute"
+indexinfo[0].command[44].indexname "wsdouble"
+indexinfo[0].command[44].command "index"
+indexinfo[0].command[45].indexname "wsdouble"
+indexinfo[0].command[45].command "multivalue"
+indexinfo[0].command[46].indexname "wsdouble"
+indexinfo[0].command[46].command "attribute"
+indexinfo[0].command[47].indexname "singlestring"
+indexinfo[0].command[47].command "index"
+indexinfo[0].command[48].indexname "singlestring"
+indexinfo[0].command[48].command "attribute"
+indexinfo[0].command[49].indexname "multistring"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "multistring"
+indexinfo[0].command[50].command "multivalue"
+indexinfo[0].command[51].indexname "multistring"
+indexinfo[0].command[51].command "attribute"
+indexinfo[0].command[52].indexname "wsstring"
+indexinfo[0].command[52].command "index"
+indexinfo[0].command[53].indexname "wsstring"
+indexinfo[0].command[53].command "multivalue"
+indexinfo[0].command[54].indexname "wsstring"
+indexinfo[0].command[54].command "attribute"
+indexinfo[0].command[55].indexname "rankfeatures"
+indexinfo[0].command[55].command "index"
+indexinfo[0].command[56].indexname "summaryfeatures"
+indexinfo[0].command[56].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/rank-profiles.cfg b/config-model/src/test/derived/attributeprefetch/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/summary.cfg b/config-model/src/test/derived/attributeprefetch/summary.cfg
new file mode 100644
index 00000000000..ef01911a41f
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/summary.cfg
@@ -0,0 +1,51 @@
+defaultsummaryid 1151071433
+classes[0].id 1151071433
+classes[0].name "default"
+classes[0].fields[0].name "rankfeatures"
+classes[0].fields[0].type "featuredata"
+classes[0].fields[1].name "summaryfeatures"
+classes[0].fields[1].type "featuredata"
+classes[0].fields[2].name "documentid"
+classes[0].fields[2].type "longstring"
+classes[1].id 1279606967
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "singlebyte"
+classes[1].fields[0].type "byte"
+classes[1].fields[1].name "multibyte"
+classes[1].fields[1].type "jsonstring"
+classes[1].fields[2].name "wsbyte"
+classes[1].fields[2].type "jsonstring"
+classes[1].fields[3].name "singleint"
+classes[1].fields[3].type "integer"
+classes[1].fields[4].name "multiint"
+classes[1].fields[4].type "jsonstring"
+classes[1].fields[5].name "wsint"
+classes[1].fields[5].type "jsonstring"
+classes[1].fields[6].name "singlelong"
+classes[1].fields[6].type "int64"
+classes[1].fields[7].name "multilong"
+classes[1].fields[7].type "jsonstring"
+classes[1].fields[8].name "wslong"
+classes[1].fields[8].type "jsonstring"
+classes[1].fields[9].name "singlefloat"
+classes[1].fields[9].type "float"
+classes[1].fields[10].name "multifloat"
+classes[1].fields[10].type "jsonstring"
+classes[1].fields[11].name "wsfloat"
+classes[1].fields[11].type "jsonstring"
+classes[1].fields[12].name "singledouble"
+classes[1].fields[12].type "double"
+classes[1].fields[13].name "multidouble"
+classes[1].fields[13].type "jsonstring"
+classes[1].fields[14].name "wsdouble"
+classes[1].fields[14].type "jsonstring"
+classes[1].fields[15].name "singlestring"
+classes[1].fields[15].type "longstring"
+classes[1].fields[16].name "multistring"
+classes[1].fields[16].type "jsonstring"
+classes[1].fields[17].name "wsstring"
+classes[1].fields[17].type "jsonstring"
+classes[1].fields[18].name "rankfeatures"
+classes[1].fields[18].type "featuredata"
+classes[1].fields[19].name "summaryfeatures"
+classes[1].fields[19].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributeprefetch/summarymap.cfg b/config-model/src/test/derived/attributeprefetch/summarymap.cfg
new file mode 100644
index 00000000000..e42657eb2bb
--- /dev/null
+++ b/config-model/src/test/derived/attributeprefetch/summarymap.cfg
@@ -0,0 +1,61 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments ""
+override[2].field "singlebyte"
+override[2].command "attribute"
+override[2].arguments "singlebyte"
+override[3].field "multibyte"
+override[3].command "attribute"
+override[3].arguments "multibyte"
+override[4].field "wsbyte"
+override[4].command "attribute"
+override[4].arguments "wsbyte"
+override[5].field "singleint"
+override[5].command "attribute"
+override[5].arguments "singleint"
+override[6].field "multiint"
+override[6].command "attribute"
+override[6].arguments "multiint"
+override[7].field "wsint"
+override[7].command "attribute"
+override[7].arguments "wsint"
+override[8].field "singlelong"
+override[8].command "attribute"
+override[8].arguments "singlelong"
+override[9].field "multilong"
+override[9].command "attribute"
+override[9].arguments "multilong"
+override[10].field "wslong"
+override[10].command "attribute"
+override[10].arguments "wslong"
+override[11].field "singlefloat"
+override[11].command "attribute"
+override[11].arguments "singlefloat"
+override[12].field "multifloat"
+override[12].command "attribute"
+override[12].arguments "multifloat"
+override[13].field "wsfloat"
+override[13].command "attribute"
+override[13].arguments "wsfloat"
+override[14].field "singledouble"
+override[14].command "attribute"
+override[14].arguments "singledouble"
+override[15].field "multidouble"
+override[15].command "attribute"
+override[15].arguments "multidouble"
+override[16].field "wsdouble"
+override[16].command "attribute"
+override[16].arguments "wsdouble"
+override[17].field "singlestring"
+override[17].command "attribute"
+override[17].arguments "singlestring"
+override[18].field "multistring"
+override[18].command "attribute"
+override[18].arguments "multistring"
+override[19].field "wsstring"
+override[19].command "attribute"
+override[19].arguments "wsstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributerank/attributerank.sd b/config-model/src/test/derived/attributerank/attributerank.sd
new file mode 100644
index 00000000000..d20f9972404
--- /dev/null
+++ b/config-model/src/test/derived/attributerank/attributerank.sd
@@ -0,0 +1,41 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search attributerank {
+
+ document attributerank {
+
+ field singlebyte type byte {
+ indexing: attribute
+ }
+ field singleint type int {
+ indexing: attribute
+ }
+ field singlelong type long {
+ indexing: attribute
+ }
+ field singlefloat type float {
+ indexing: attribute
+ rank-type: identity
+ }
+ field singledouble type double {
+ indexing: attribute
+ rank-type: identity
+ }
+ field singlestring type string {
+ indexing: attribute
+ rank-type: identity
+ }
+ }
+
+ rank-profile firstprofile inherits default {
+ rank-type singlestring: default
+ }
+
+ rank-profile secondprofile inherits identity {
+ rank-type singlebyte: identity
+ rank-type singleint: identity
+ rank-type singlelong: identity
+ rank-type singlefloat: identity
+ rank-type singledouble: identity
+ rank-type singlestring: identity
+ }
+}
diff --git a/config-model/src/test/derived/attributerank/rank-profiles.cfg b/config-model/src/test/derived/attributerank/rank-profiles.cfg
new file mode 100644
index 00000000000..b37289705ec
--- /dev/null
+++ b/config-model/src/test/derived/attributerank/rank-profiles.cfg
@@ -0,0 +1,34 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeAttributeMatch.weightTable.singlefloat"
+rankprofile[0].fef.property[0].value "linear(1,0)"
+rankprofile[0].fef.property[1].name "nativeAttributeMatch.weightTable.singledouble"
+rankprofile[0].fef.property[1].value "linear(1,0)"
+rankprofile[0].fef.property[2].name "nativeAttributeMatch.weightTable.singlestring"
+rankprofile[0].fef.property[2].value "linear(1,0)"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "firstprofile"
+rankprofile[2].fef.property[0].name "nativeAttributeMatch.weightTable.singlefloat"
+rankprofile[2].fef.property[0].value "linear(1,0)"
+rankprofile[2].fef.property[1].name "nativeAttributeMatch.weightTable.singledouble"
+rankprofile[2].fef.property[1].value "linear(1,0)"
+rankprofile[3].name "secondprofile"
+rankprofile[3].fef.property[0].name "nativeAttributeMatch.weightTable.singlebyte"
+rankprofile[3].fef.property[0].value "linear(1,0)"
+rankprofile[3].fef.property[1].name "nativeAttributeMatch.weightTable.singleint"
+rankprofile[3].fef.property[1].value "linear(1,0)"
+rankprofile[3].fef.property[2].name "nativeAttributeMatch.weightTable.singlelong"
+rankprofile[3].fef.property[2].value "linear(1,0)"
+rankprofile[3].fef.property[3].name "nativeAttributeMatch.weightTable.singlefloat"
+rankprofile[3].fef.property[3].value "linear(1,0)"
+rankprofile[3].fef.property[4].name "nativeAttributeMatch.weightTable.singledouble"
+rankprofile[3].fef.property[4].value "linear(1,0)"
+rankprofile[3].fef.property[5].name "nativeAttributeMatch.weightTable.singlestring"
+rankprofile[3].fef.property[5].value "linear(1,0)" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributes/attributes.cfg b/config-model/src/test/derived/attributes/attributes.cfg
new file mode 100644
index 00000000000..38f55f9645d
--- /dev/null
+++ b/config-model/src/test/derived/attributes/attributes.cfg
@@ -0,0 +1,342 @@
+attribute[0].name "a1"
+attribute[0].datatype STRING
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "a2"
+attribute[1].datatype STRING
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "a3"
+attribute[2].datatype STRING
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "a5"
+attribute[3].datatype STRING
+attribute[3].collectiontype SINGLE
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "a6"
+attribute[4].datatype STRING
+attribute[4].collectiontype SINGLE
+attribute[4].removeifzero false
+attribute[4].createifnonexistent false
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "b1"
+attribute[5].datatype STRING
+attribute[5].collectiontype SINGLE
+attribute[5].removeifzero false
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "b2"
+attribute[6].datatype STRING
+attribute[6].collectiontype SINGLE
+attribute[6].removeifzero false
+attribute[6].createifnonexistent false
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "b3"
+attribute[7].datatype STRING
+attribute[7].collectiontype SINGLE
+attribute[7].removeifzero false
+attribute[7].createifnonexistent false
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "b4"
+attribute[8].datatype INT32
+attribute[8].collectiontype SINGLE
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch false
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype ""
+attribute[9].name "b5"
+attribute[9].datatype INT32
+attribute[9].collectiontype SINGLE
+attribute[9].removeifzero false
+attribute[9].createifnonexistent false
+attribute[9].fastsearch false
+attribute[9].huge false
+attribute[9].sortascending true
+attribute[9].sortfunction UCA
+attribute[9].sortstrength PRIMARY
+attribute[9].sortlocale ""
+attribute[9].enablebitvectors false
+attribute[9].enableonlybitvector false
+attribute[9].fastaccess false
+attribute[9].arity 8
+attribute[9].lowerbound -9223372036854775808
+attribute[9].upperbound 9223372036854775807
+attribute[9].densepostinglistthreshold 0.4
+attribute[9].tensortype ""
+attribute[10].name "b6"
+attribute[10].datatype INT64
+attribute[10].collectiontype ARRAY
+attribute[10].removeifzero false
+attribute[10].createifnonexistent false
+attribute[10].fastsearch false
+attribute[10].huge false
+attribute[10].sortascending true
+attribute[10].sortfunction UCA
+attribute[10].sortstrength PRIMARY
+attribute[10].sortlocale ""
+attribute[10].enablebitvectors false
+attribute[10].enableonlybitvector false
+attribute[10].fastaccess false
+attribute[10].arity 8
+attribute[10].lowerbound -9223372036854775808
+attribute[10].upperbound 9223372036854775807
+attribute[10].densepostinglistthreshold 0.4
+attribute[10].tensortype ""
+attribute[11].name "b7"
+attribute[11].datatype DOUBLE
+attribute[11].collectiontype WEIGHTEDSET
+attribute[11].removeifzero false
+attribute[11].createifnonexistent false
+attribute[11].fastsearch false
+attribute[11].huge false
+attribute[11].sortascending true
+attribute[11].sortfunction UCA
+attribute[11].sortstrength PRIMARY
+attribute[11].sortlocale ""
+attribute[11].enablebitvectors false
+attribute[11].enableonlybitvector false
+attribute[11].fastaccess false
+attribute[11].arity 8
+attribute[11].lowerbound -9223372036854775808
+attribute[11].upperbound 9223372036854775807
+attribute[11].densepostinglistthreshold 0.4
+attribute[11].tensortype ""
+attribute[12].name "a9"
+attribute[12].datatype INT32
+attribute[12].collectiontype SINGLE
+attribute[12].removeifzero false
+attribute[12].createifnonexistent false
+attribute[12].fastsearch false
+attribute[12].huge false
+attribute[12].sortascending true
+attribute[12].sortfunction UCA
+attribute[12].sortstrength PRIMARY
+attribute[12].sortlocale ""
+attribute[12].enablebitvectors true
+attribute[12].enableonlybitvector false
+attribute[12].fastaccess false
+attribute[12].arity 8
+attribute[12].lowerbound -9223372036854775808
+attribute[12].upperbound 9223372036854775807
+attribute[12].densepostinglistthreshold 0.4
+attribute[12].tensortype ""
+attribute[13].name "a10"
+attribute[13].datatype INT32
+attribute[13].collectiontype ARRAY
+attribute[13].removeifzero false
+attribute[13].createifnonexistent false
+attribute[13].fastsearch true
+attribute[13].huge false
+attribute[13].sortascending true
+attribute[13].sortfunction UCA
+attribute[13].sortstrength PRIMARY
+attribute[13].sortlocale ""
+attribute[13].enablebitvectors true
+attribute[13].enableonlybitvector true
+attribute[13].fastaccess false
+attribute[13].arity 8
+attribute[13].lowerbound -9223372036854775808
+attribute[13].upperbound 9223372036854775807
+attribute[13].densepostinglistthreshold 0.4
+attribute[13].tensortype ""
+attribute[14].name "a11"
+attribute[14].datatype INT32
+attribute[14].collectiontype SINGLE
+attribute[14].removeifzero false
+attribute[14].createifnonexistent false
+attribute[14].fastsearch false
+attribute[14].huge false
+attribute[14].sortascending true
+attribute[14].sortfunction UCA
+attribute[14].sortstrength PRIMARY
+attribute[14].sortlocale ""
+attribute[14].enablebitvectors false
+attribute[14].enableonlybitvector false
+attribute[14].fastaccess true
+attribute[14].arity 8
+attribute[14].lowerbound -9223372036854775808
+attribute[14].upperbound 9223372036854775807
+attribute[14].densepostinglistthreshold 0.4
+attribute[14].tensortype ""
+attribute[15].name "a12"
+attribute[15].datatype INT32
+attribute[15].collectiontype SINGLE
+attribute[15].removeifzero false
+attribute[15].createifnonexistent false
+attribute[15].fastsearch false
+attribute[15].huge false
+attribute[15].sortascending true
+attribute[15].sortfunction UCA
+attribute[15].sortstrength PRIMARY
+attribute[15].sortlocale ""
+attribute[15].enablebitvectors true
+attribute[15].enableonlybitvector true
+attribute[15].fastaccess false
+attribute[15].arity 8
+attribute[15].lowerbound -9223372036854775808
+attribute[15].upperbound 9223372036854775807
+attribute[15].densepostinglistthreshold 0.4
+attribute[15].tensortype ""
+attribute[16].name "a7_arr"
+attribute[16].datatype STRING
+attribute[16].collectiontype ARRAY
+attribute[16].removeifzero false
+attribute[16].createifnonexistent false
+attribute[16].fastsearch false
+attribute[16].huge false
+attribute[16].sortascending true
+attribute[16].sortfunction UCA
+attribute[16].sortstrength PRIMARY
+attribute[16].sortlocale ""
+attribute[16].enablebitvectors false
+attribute[16].enableonlybitvector false
+attribute[16].fastaccess false
+attribute[16].arity 8
+attribute[16].lowerbound -9223372036854775808
+attribute[16].upperbound 9223372036854775807
+attribute[16].densepostinglistthreshold 0.4
+attribute[16].tensortype ""
+attribute[17].name "a8_arr"
+attribute[17].datatype STRING
+attribute[17].collectiontype ARRAY
+attribute[17].removeifzero false
+attribute[17].createifnonexistent false
+attribute[17].fastsearch false
+attribute[17].huge false
+attribute[17].sortascending true
+attribute[17].sortfunction UCA
+attribute[17].sortstrength PRIMARY
+attribute[17].sortlocale ""
+attribute[17].enablebitvectors false
+attribute[17].enableonlybitvector false
+attribute[17].fastaccess false
+attribute[17].arity 8
+attribute[17].lowerbound -9223372036854775808
+attribute[17].upperbound 9223372036854775807
+attribute[17].densepostinglistthreshold 0.4
+attribute[17].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributes/attributes.sd b/config-model/src/test/derived/attributes/attributes.sd
new file mode 100644
index 00000000000..95df6367ee7
--- /dev/null
+++ b/config-model/src/test/derived/attributes/attributes.sd
@@ -0,0 +1,121 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search attributes {
+
+ document attributes {
+
+ # Summary value taken from attribute
+ field a1 type string {
+ indexing: attribute | summary
+ match {
+ token
+ }
+ }
+
+ # Summary value taken from summary
+ field a2 type string {
+ indexing: attribute | summary
+ match {
+ token
+ }
+ }
+
+ # Summary value taken from summary
+ field a3 type string {
+ indexing: attribute | summary
+ match {
+ token
+ }
+ }
+
+ # No attribute
+ field a4 type string {
+ indexing: summary
+ }
+
+ # Unique only - not searchable. No match-group since the attribute is not to be used for searching
+ field a5 type string {
+ indexing: attribute | summary | index
+ }
+
+ # Not searchable
+ field a6 type string {
+ indexing: attribute | summary | index
+ }
+
+ # Multivalued; summary override
+ field a7 type string {
+ indexing: summary
+ }
+
+ # Multivalued; summary override
+ field a8 type string {
+ indexing: summary
+ }
+
+ field b1 type string {
+ indexing: attribute | summary
+ }
+
+ field b2 type string {
+ indexing: attribute | summary | index
+ }
+
+ field b3 type string {
+ indexing: attribute | summary | index
+ alias: date
+ }
+
+ field b4 type int {
+ indexing: attribute | summary
+ }
+
+ # integers (should not trigger exact-match query parsing)
+ field b5 type int {
+ indexing: summary | attribute
+ }
+ field b6 type array<long> {
+ indexing: summary | attribute
+ }
+ field b7 type weightedset<double> {
+ indexing: summary | attribute
+ }
+
+ field a9 type int {
+ indexing: attribute
+ attribute: enable-bit-vectors
+ }
+
+ field a10 type array<int> {
+ indexing: attribute
+ attribute {
+ fast-search
+ enable-only-bit-vector
+ enable-bit-vectors
+ }
+ }
+
+ field a11 type int {
+ indexing: attribute
+ attribute: fast-access
+ }
+
+ field a12 type int {
+ indexing: attribute
+ rank: filter
+ }
+
+ }
+
+ field a7_arr type array<string> {
+ indexing: input a7 | split ";" | attribute
+ }
+
+ field a8_arr type array<string> {
+ indexing: input a8 | split ";" | attribute
+ }
+
+ fieldset default {
+ fields: a5, a6
+ }
+
+}
diff --git a/config-model/src/test/derived/attributes/ilscripts.cfg b/config-model/src/test/derived/attributes/ilscripts.cfg
new file mode 100644
index 00000000000..450cc8e499c
--- /dev/null
+++ b/config-model/src/test/derived/attributes/ilscripts.cfg
@@ -0,0 +1,42 @@
+maxtermoccurrences 100
+ilscript[0].doctype "attributes"
+ilscript[0].docfield[0] "a1"
+ilscript[0].docfield[1] "a2"
+ilscript[0].docfield[2] "a3"
+ilscript[0].docfield[3] "a4"
+ilscript[0].docfield[4] "a5"
+ilscript[0].docfield[5] "a6"
+ilscript[0].docfield[6] "a7"
+ilscript[0].docfield[7] "a8"
+ilscript[0].docfield[8] "b1"
+ilscript[0].docfield[9] "b2"
+ilscript[0].docfield[10] "b3"
+ilscript[0].docfield[11] "b4"
+ilscript[0].docfield[12] "b5"
+ilscript[0].docfield[13] "b6"
+ilscript[0].docfield[14] "b7"
+ilscript[0].docfield[15] "a9"
+ilscript[0].docfield[16] "a10"
+ilscript[0].docfield[17] "a11"
+ilscript[0].docfield[18] "a12"
+ilscript[0].content[0] "clear_state | guard { input a7 | split \";\" | attribute a7_arr; }"
+ilscript[0].content[1] "clear_state | guard { input a8 | split \";\" | attribute a8_arr; }"
+ilscript[0].content[2] "clear_state | guard { input a1 | attribute a1 | summary a1; }"
+ilscript[0].content[3] "clear_state | guard { input a2 | attribute a2 | summary a2; }"
+ilscript[0].content[4] "clear_state | guard { input a3 | attribute a3 | summary a3; }"
+ilscript[0].content[5] "clear_state | guard { input a4 | summary a4; }"
+ilscript[0].content[6] "clear_state | guard { input a5 | tokenize normalize stem:\"SHORTEST\" | attribute a5 | summary a5 | index a5; }"
+ilscript[0].content[7] "clear_state | guard { input a6 | tokenize normalize stem:\"SHORTEST\" | attribute a6 | summary a6 | index a6; }"
+ilscript[0].content[8] "clear_state | guard { input a7 | summary a7; }"
+ilscript[0].content[9] "clear_state | guard { input a8 | summary a8; }"
+ilscript[0].content[10] "clear_state | guard { input b1 | attribute b1 | summary b1; }"
+ilscript[0].content[11] "clear_state | guard { input b2 | tokenize normalize stem:\"SHORTEST\" | attribute b2 | summary b2 | index b2; }"
+ilscript[0].content[12] "clear_state | guard { input b3 | tokenize normalize stem:\"SHORTEST\" | attribute b3 | summary b3 | index b3; }"
+ilscript[0].content[13] "clear_state | guard { input b4 | attribute b4 | summary b4; }"
+ilscript[0].content[14] "clear_state | guard { input b5 | summary b5 | attribute b5; }"
+ilscript[0].content[15] "clear_state | guard { input b6 | summary b6 | attribute b6; }"
+ilscript[0].content[16] "clear_state | guard { input b7 | summary b7 | attribute b7; }"
+ilscript[0].content[17] "clear_state | guard { input a9 | attribute a9; }"
+ilscript[0].content[18] "clear_state | guard { input a10 | attribute a10; }"
+ilscript[0].content[19] "clear_state | guard { input a11 | attribute a11; }"
+ilscript[0].content[20] "clear_state | guard { input a12 | attribute a12; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributes/index-info.cfg b/config-model/src/test/derived/attributes/index-info.cfg
new file mode 100644
index 00000000000..c9a12da4479
--- /dev/null
+++ b/config-model/src/test/derived/attributes/index-info.cfg
@@ -0,0 +1,141 @@
+indexinfo[0].name "attributes"
+indexinfo[0].command[].indexname "sddocname"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "sddocname"
+indexinfo[0].command[].command "word"
+indexinfo[0].command[].indexname "a1"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a1"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a2"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a2"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a3"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a3"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a4"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a5"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a5"
+indexinfo[0].command[].command "lowercase"
+indexinfo[0].command[].indexname "a5"
+indexinfo[0].command[].command "stem:SHORTEST"
+indexinfo[0].command[].indexname "a5"
+indexinfo[0].command[].command "normalize"
+indexinfo[0].command[].indexname "a6"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a6"
+indexinfo[0].command[].command "lowercase"
+indexinfo[0].command[].indexname "a6"
+indexinfo[0].command[].command "stem:SHORTEST"
+indexinfo[0].command[].indexname "a6"
+indexinfo[0].command[].command "normalize"
+indexinfo[0].command[].indexname "default"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "default"
+indexinfo[0].command[].command "lowercase"
+indexinfo[0].command[].indexname "default"
+indexinfo[0].command[].command "stem:SHORTEST"
+indexinfo[0].command[].indexname "default"
+indexinfo[0].command[].command "normalize"
+indexinfo[0].command[].indexname "a7"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a8"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b1"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b1"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "b1"
+indexinfo[0].command[].command "word"
+indexinfo[0].command[].indexname "b2"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b2"
+indexinfo[0].command[].command "lowercase"
+indexinfo[0].command[].indexname "b2"
+indexinfo[0].command[].command "stem:SHORTEST"
+indexinfo[0].command[].indexname "b2"
+indexinfo[0].command[].command "normalize"
+indexinfo[0].command[].indexname "b3"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b3"
+indexinfo[0].command[].command "lowercase"
+indexinfo[0].command[].indexname "b3"
+indexinfo[0].command[].command "stem:SHORTEST"
+indexinfo[0].command[].indexname "b3"
+indexinfo[0].command[].command "normalize"
+indexinfo[0].command[].indexname "b4"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b4"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "b4"
+indexinfo[0].command[].command "numerical"
+indexinfo[0].command[].indexname "b5"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b5"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "b5"
+indexinfo[0].command[].command "numerical"
+indexinfo[0].command[].indexname "b6"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b6"
+indexinfo[0].command[].command "multivalue"
+indexinfo[0].command[].indexname "b6"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "b7"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "b7"
+indexinfo[0].command[].command "multivalue"
+indexinfo[0].command[].indexname "b7"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a9"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a9"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a9"
+indexinfo[0].command[].command "numerical"
+indexinfo[0].command[].indexname "a10"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a10"
+indexinfo[0].command[].command "multivalue"
+indexinfo[0].command[].indexname "a10"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a10"
+indexinfo[0].command[].command "fast-search"
+indexinfo[0].command[].indexname "a11"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a11"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a11"
+indexinfo[0].command[].command "numerical"
+indexinfo[0].command[].indexname "a12"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a12"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a12"
+indexinfo[0].command[].command "numerical"
+indexinfo[0].command[].indexname "a7_arr"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a7_arr"
+indexinfo[0].command[].command "multivalue"
+indexinfo[0].command[].indexname "a7_arr"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a7_arr"
+indexinfo[0].command[].command "word"
+indexinfo[0].command[].indexname "a8_arr"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "a8_arr"
+indexinfo[0].command[].command "multivalue"
+indexinfo[0].command[].indexname "a8_arr"
+indexinfo[0].command[].command "attribute"
+indexinfo[0].command[].indexname "a8_arr"
+indexinfo[0].command[].command "word"
+indexinfo[0].command[].indexname "rankfeatures"
+indexinfo[0].command[].command "index"
+indexinfo[0].command[].indexname "summaryfeatures"
+indexinfo[0].command[].command "index"
+indexinfo[0].alias[].alias "date"
+indexinfo[0].alias[].indexname "b3" \ No newline at end of file
diff --git a/config-model/src/test/derived/attributes/summarymap.cfg b/config-model/src/test/derived/attributes/summarymap.cfg
new file mode 100644
index 00000000000..f13a8ab0b82
--- /dev/null
+++ b/config-model/src/test/derived/attributes/summarymap.cfg
@@ -0,0 +1,52 @@
+defaultoutputclass -1
+override[0].field "a1"
+override[0].command "attribute"
+override[0].arguments "a1"
+override[1].field "a2"
+override[1].command "attribute"
+override[1].arguments "a2"
+override[2].field "a3"
+override[2].command "attribute"
+override[2].arguments "a3"
+override[3].field "a5"
+override[3].command "attribute"
+override[3].arguments "a5"
+override[4].field "a6"
+override[4].command "attribute"
+override[4].arguments "a6"
+override[5].field "b1"
+override[5].command "attribute"
+override[5].arguments "b1"
+override[6].field "b2"
+override[6].command "attribute"
+override[6].arguments "b2"
+override[7].field "b3"
+override[7].command "attribute"
+override[7].arguments "b3"
+override[8].field "b4"
+override[8].command "attribute"
+override[8].arguments "b4"
+override[9].field "b5"
+override[9].command "attribute"
+override[9].arguments "b5"
+override[10].field "b6"
+override[10].command "attribute"
+override[10].arguments "b6"
+override[11].field "b7"
+override[11].command "attribute"
+override[11].arguments "b7"
+override[12].field "rankfeatures"
+override[12].command "rankfeatures"
+override[12].arguments ""
+override[13].field "summaryfeatures"
+override[13].command "summaryfeatures"
+override[13].arguments ""
+override[14].field "a9"
+override[14].command "attribute"
+override[14].arguments "a9"
+override[15].field "a11"
+override[15].command "attribute"
+override[15].arguments "a11"
+override[16].field "a12"
+override[16].command "attribute"
+override[16].arguments "a12" \ No newline at end of file
diff --git a/config-model/src/test/derived/combinedattributeandindexsearch/combinedattributeandindexsearch.sd b/config-model/src/test/derived/combinedattributeandindexsearch/combinedattributeandindexsearch.sd
new file mode 100644
index 00000000000..a20b5d2cfcc
--- /dev/null
+++ b/config-model/src/test/derived/combinedattributeandindexsearch/combinedattributeandindexsearch.sd
@@ -0,0 +1,34 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search combinedattributeandindexsearch {
+
+ document combinedattributeandindexsearch {
+
+ field index1 type string {
+ indexing: index | summary
+ }
+
+ field index2 type string {
+ indexing: index
+ }
+
+ field attribute1 type string {
+ indexing: attribute | summary
+ match {
+ token
+ }
+ }
+
+ field attribute2 type string {
+ indexing: attribute
+ match {
+ token
+ }
+ }
+
+ }
+
+ fieldset default {
+ fields: index1, index2, attribute1, attribute2
+ }
+
+}
diff --git a/config-model/src/test/derived/combinedattributeandindexsearch/index-info.cfg b/config-model/src/test/derived/combinedattributeandindexsearch/index-info.cfg
new file mode 100644
index 00000000000..cd56d204e96
--- /dev/null
+++ b/config-model/src/test/derived/combinedattributeandindexsearch/index-info.cfg
@@ -0,0 +1,41 @@
+indexinfo[0].name "combinedattributeandindexsearch"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "index1"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "default"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "index1"
+indexinfo[0].command[4].command "lowercase"
+indexinfo[0].command[5].indexname "default"
+indexinfo[0].command[5].command "lowercase"
+indexinfo[0].command[6].indexname "index1"
+indexinfo[0].command[6].command "stem:SHORTEST"
+indexinfo[0].command[7].indexname "default"
+indexinfo[0].command[7].command "stem:SHORTEST"
+indexinfo[0].command[8].indexname "index1"
+indexinfo[0].command[8].command "normalize"
+indexinfo[0].command[9].indexname "default"
+indexinfo[0].command[9].command "normalize"
+indexinfo[0].command[10].indexname "attribute1"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "attribute1"
+indexinfo[0].command[11].command "attribute"
+indexinfo[0].command[12].indexname "attribute2"
+indexinfo[0].command[12].command "attribute"
+indexinfo[0].command[12].indexname "attribute2"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[14].indexname "rankfeatures"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "summaryfeatures"
+indexinfo[0].command[15].command "index"
+indexinfo[0].command[2].indexname "index2"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[4].indexname "index2"
+indexinfo[0].command[4].command "lowercase"
+indexinfo[0].command[6].indexname "index2"
+indexinfo[0].command[6].command "stem:SHORTEST"
+indexinfo[0].command[8].indexname "index2"
+indexinfo[0].command[8].command "normalize"
diff --git a/config-model/src/test/derived/complex/attributes.cfg b/config-model/src/test/derived/complex/attributes.cfg
new file mode 100644
index 00000000000..b6ae59b5c24
--- /dev/null
+++ b/config-model/src/test/derived/complex/attributes.cfg
@@ -0,0 +1,171 @@
+attribute[0].name "prefixenabled"
+attribute[0].datatype STRING
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge true
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "fleeting"
+attribute[1].datatype FLOAT
+attribute[1].collectiontype ARRAY
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "fleeting2"
+attribute[2].datatype FLOAT
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "foundat"
+attribute[3].datatype INT64
+attribute[3].collectiontype SINGLE
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "collapseby"
+attribute[4].datatype INT32
+attribute[4].collectiontype SINGLE
+attribute[4].removeifzero false
+attribute[4].createifnonexistent false
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "ts"
+attribute[5].datatype INT64
+attribute[5].collectiontype SINGLE
+attribute[5].removeifzero false
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "combineda"
+attribute[6].datatype INT32
+attribute[6].collectiontype SINGLE
+attribute[6].removeifzero false
+attribute[6].createifnonexistent false
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "year_arr"
+attribute[7].datatype INT32
+attribute[7].collectiontype ARRAY
+attribute[7].removeifzero false
+attribute[7].createifnonexistent false
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "year_sub"
+attribute[8].datatype INT32
+attribute[8].collectiontype SINGLE
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch false
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/complex/complex.sd b/config-model/src/test/derived/complex/complex.sd
new file mode 100644
index 00000000000..6dcce8689f8
--- /dev/null
+++ b/config-model/src/test/derived/complex/complex.sd
@@ -0,0 +1,150 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search complex {
+
+ document complex {
+
+ field title type string {
+ indexing: index | summary
+ index default: prefix
+ rank-type: about
+ query-command: some-custom-command # Some command handled in a qustom searcher
+ query-command: some-other
+ alias default: some.default
+ alias: titlez
+ match: token
+ }
+
+ field location type string {
+
+ }
+
+ field dyntitle type string {
+ indexing: summary
+ summary: dynamic
+ }
+
+ field special1 type string {
+ indexing: index
+ stemming: none
+ }
+
+ field special2 type string {
+ indexing: index
+ stemming: none
+ }
+
+ field special3 type string {
+ indexing: index
+ stemming: none
+ }
+
+ field prefixenabled type string {
+ indexing: index | attribute
+ index: prefix
+ attribute: prefetch
+ attribute: huge
+ normalizing: none
+ stemming: shortest
+ }
+
+ field source type uri {
+ indexing: summary | index
+ }
+
+ field docurl type uri {
+ indexing: index
+ alias docurl: url
+ }
+
+ field fleeting type array<float> {
+ indexing: index | attribute
+ attribute: prefetch
+ }
+
+ field fleeting2 type float {
+ indexing: index | attribute
+ attribute: prefetch
+ }
+
+ field foundat type long {
+ indexing: index
+ }
+
+ field collapseby type int {
+ indexing: index
+ }
+
+ field yEaR type int {
+
+ }
+
+ field stringfield type string {
+ indexing: summary | index
+ }
+
+ field exactemento type string {
+ indexing: index
+ }
+
+ field exactagain type string {
+ indexing: index
+ }
+
+ field ts type long {
+ indexing: attribute
+ }
+
+ field combineda type int {
+ indexing: index
+ }
+
+ field combinedb type string {
+ indexing: index
+ }
+
+ field category type string {
+
+ }
+
+ }
+
+ field woe type string {
+ indexing: input location | summary | index
+ }
+
+ field year_sub type int {
+ indexing: input yEaR - 1900 | attribute year_sub
+ }
+
+ field year_arr type array<int> {
+ indexing: input yEaR | to_array | attribute
+ }
+
+ # A field defined outside an index
+ field exact type string {
+ indexing {
+ input title . input category | summary | index;
+ }
+ stemming: none
+ normalizing: none
+ rank-type: identity
+ }
+
+ # Some experimental ranking changes
+ rank-profile experimental inherits default {
+ }
+
+ rank-profile other inherits experimental {
+ rank-type source: identity
+ }
+ fieldset default {
+ fields: title, stringfield
+ }
+ fieldset special {
+ fields: special1, special2, special3
+ }
+ fieldset all {
+ fields: combineda, combinedb
+ }
+
+}
diff --git a/config-model/src/test/derived/complex/documentmanager.cfg b/config-model/src/test/derived/complex/documentmanager.cfg
new file mode 100644
index 00000000000..66ebbbb2846
--- /dev/null
+++ b/config-model/src/test/derived/complex/documentmanager.cfg
@@ -0,0 +1,119 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1650586661
+datatype[1].arraytype[0].datatype 1
+datatype[2].id -1245117006
+datatype[2].arraytype[0].datatype 0
+datatype[3].id -1749463923
+datatype[3].structtype[0].name "complex.header"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "title"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[1].name "location"
+datatype[3].structtype[0].field[1].datatype 2
+datatype[3].structtype[0].field[2].name "dyntitle"
+datatype[3].structtype[0].field[2].datatype 2
+datatype[3].structtype[0].field[3].name "special1"
+datatype[3].structtype[0].field[3].datatype 2
+datatype[3].structtype[0].field[4].name "special2"
+datatype[3].structtype[0].field[4].datatype 2
+datatype[3].structtype[0].field[5].name "special3"
+datatype[3].structtype[0].field[5].datatype 2
+datatype[3].structtype[0].field[6].name "prefixenabled"
+datatype[3].structtype[0].field[6].datatype 2
+datatype[3].structtype[0].field[7].name "source"
+datatype[3].structtype[0].field[7].datatype 10
+datatype[3].structtype[0].field[8].name "docurl"
+datatype[3].structtype[0].field[8].datatype 10
+datatype[3].structtype[0].field[9].name "fleeting"
+datatype[3].structtype[0].field[9].datatype 1650586661
+datatype[3].structtype[0].field[10].name "fleeting2"
+datatype[3].structtype[0].field[10].datatype 1
+datatype[3].structtype[0].field[11].name "foundat"
+datatype[3].structtype[0].field[11].datatype 4
+datatype[3].structtype[0].field[12].name "collapseby"
+datatype[3].structtype[0].field[12].datatype 0
+datatype[3].structtype[0].field[13].name "yEaR"
+datatype[3].structtype[0].field[13].datatype 0
+datatype[3].structtype[0].field[14].name "stringfield"
+datatype[3].structtype[0].field[14].datatype 2
+datatype[3].structtype[0].field[15].name "exactemento"
+datatype[3].structtype[0].field[15].datatype 2
+datatype[3].structtype[0].field[16].name "exactagain"
+datatype[3].structtype[0].field[16].datatype 2
+datatype[3].structtype[0].field[17].name "ts"
+datatype[3].structtype[0].field[17].datatype 4
+datatype[3].structtype[0].field[18].name "combineda"
+datatype[3].structtype[0].field[18].datatype 0
+datatype[3].structtype[0].field[19].name "combinedb"
+datatype[3].structtype[0].field[19].datatype 2
+datatype[3].structtype[0].field[20].name "category"
+datatype[3].structtype[0].field[20].datatype 2
+datatype[3].structtype[0].field[21].name "woe"
+datatype[3].structtype[0].field[21].datatype 2
+datatype[3].structtype[0].field[22].name "year_sub"
+datatype[3].structtype[0].field[22].datatype 0
+datatype[3].structtype[0].field[23].name "year_arr"
+datatype[3].structtype[0].field[23].datatype -1245117006
+datatype[3].structtype[0].field[24].name "exact"
+datatype[3].structtype[0].field[24].datatype 2
+datatype[3].structtype[0].field[25].name "rankfeatures"
+datatype[3].structtype[0].field[25].datatype 2
+datatype[3].structtype[0].field[26].name "summaryfeatures"
+datatype[3].structtype[0].field[26].datatype 2
+datatype[4].id -1665926686
+datatype[4].structtype[0].name "complex.body"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[5].id -1402929550
+datatype[5].documenttype[0].name "complex"
+datatype[5].documenttype[0].version 0
+datatype[5].documenttype[0].inherits[0].name "document"
+datatype[5].documenttype[0].inherits[0].version 0
+datatype[5].documenttype[0].headerstruct -1749463923
+datatype[5].documenttype[0].bodystruct -1665926686
+datatype[5].documenttype[0].fieldsets{default}.fields[0] "stringfield"
+datatype[5].documenttype[0].fieldsets{default}.fields[1] "title"
+datatype[5].documenttype[0].fieldsets{special}.fields[0] "special1"
+datatype[5].documenttype[0].fieldsets{special}.fields[1] "special2"
+datatype[5].documenttype[0].fieldsets{special}.fields[2] "special3"
+datatype[5].documenttype[0].fieldsets{all}.fields[0] "combineda"
+datatype[5].documenttype[0].fieldsets{all}.fields[1] "combinedb"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[0] "category"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[1] "collapseby"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[2] "combineda"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[3] "combinedb"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[4] "docurl"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[5] "dyntitle"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[6] "exactagain"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[7] "exactemento"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[8] "fleeting"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[9] "fleeting2"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[10] "foundat"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[11] "location"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[12] "prefixenabled"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[13] "source"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[14] "special1"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[15] "special2"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[16] "special3"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[17] "stringfield"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[18] "title"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[19] "ts"
+datatype[5].documenttype[0].fieldsets{[document]}.fields[20] "yEaR"
diff --git a/config-model/src/test/derived/complex/ilscripts.cfg b/config-model/src/test/derived/complex/ilscripts.cfg
new file mode 100644
index 00000000000..05de728e16e
--- /dev/null
+++ b/config-model/src/test/derived/complex/ilscripts.cfg
@@ -0,0 +1,48 @@
+maxtermoccurrences 100
+ilscript[0].doctype "complex"
+ilscript[0].docfield[0] "title"
+ilscript[0].docfield[1] "location"
+ilscript[0].docfield[2] "dyntitle"
+ilscript[0].docfield[3] "special1"
+ilscript[0].docfield[4] "special2"
+ilscript[0].docfield[5] "special3"
+ilscript[0].docfield[6] "prefixenabled"
+ilscript[0].docfield[7] "source"
+ilscript[0].docfield[8] "docurl"
+ilscript[0].docfield[9] "fleeting"
+ilscript[0].docfield[10] "fleeting2"
+ilscript[0].docfield[11] "foundat"
+ilscript[0].docfield[12] "collapseby"
+ilscript[0].docfield[13] "yEaR"
+ilscript[0].docfield[14] "stringfield"
+ilscript[0].docfield[15] "exactemento"
+ilscript[0].docfield[16] "exactagain"
+ilscript[0].docfield[17] "ts"
+ilscript[0].docfield[18] "combineda"
+ilscript[0].docfield[19] "combinedb"
+ilscript[0].docfield[20] "category"
+ilscript[0].content[0] "clear_state | guard { input title . input category | tokenize | summary exact | index exact; }"
+ilscript[0].content[1] "clear_state | guard { input location | tokenize normalize stem:\"SHORTEST\" | summary woe | index woe; }"
+ilscript[0].content[2] "clear_state | guard { input yEaR | to_array | attribute year_arr; }"
+ilscript[0].content[3] "clear_state | guard { input yEaR - 1900 | attribute year_sub; }"
+ilscript[0].content[4] "clear_state | guard { input title | tokenize normalize stem:\"SHORTEST\" | index title | summary title; }"
+ilscript[0].content[5] "clear_state | guard { input dyntitle | tokenize normalize stem:\"SHORTEST\" | summary dyntitle; }"
+ilscript[0].content[6] "clear_state | guard { input special1 | tokenize normalize | index special1; }"
+ilscript[0].content[7] "clear_state | guard { input special2 | tokenize normalize | index special2; }"
+ilscript[0].content[8] "clear_state | guard { input special3 | tokenize normalize | index special3; }"
+ilscript[0].content[9] "clear_state | guard { input prefixenabled | tokenize stem:\"SHORTEST\" | index prefixenabled | attribute prefixenabled; }"
+ilscript[0].content[10] "clear_state | guard { input source | summary source | index source; }"
+ilscript[0].content[11] "clear_state | guard { input docurl | index docurl; }"
+ilscript[0].content[12] "clear_state | guard { input fleeting | attribute fleeting; }"
+ilscript[0].content[13] "clear_state | guard { input fleeting2 | attribute fleeting2; }"
+ilscript[0].content[14] "clear_state | guard { input foundat | attribute foundat; }"
+ilscript[0].content[15] "clear_state | guard { input collapseby | attribute collapseby; }"
+ilscript[0].content[16] "clear_state | guard { input stringfield | tokenize normalize stem:\"SHORTEST\" | summary stringfield | index stringfield; }"
+ilscript[0].content[17] "clear_state | guard { input exactemento | tokenize normalize stem:\"SHORTEST\" | index exactemento; }"
+ilscript[0].content[18] "clear_state | guard { input exactagain | tokenize normalize stem:\"SHORTEST\" | index exactagain; }"
+ilscript[0].content[19] "clear_state | guard { input ts | attribute ts; }"
+ilscript[0].content[20] "clear_state | guard { input combineda | attribute combineda; }"
+ilscript[0].content[21] "clear_state | guard { input combinedb | tokenize normalize stem:\"SHORTEST\" | index combinedb; }"
+ilscript[0].content[22] "input category | passthrough category"
+ilscript[0].content[23] "input location | passthrough location"
+ilscript[0].content[24] "input yEaR | passthrough yEaR" \ No newline at end of file
diff --git a/config-model/src/test/derived/complex/rank-profiles.cfg b/config-model/src/test/derived/complex/rank-profiles.cfg
new file mode 100644
index 00000000000..5e2804d0ee6
--- /dev/null
+++ b/config-model/src/test/derived/complex/rank-profiles.cfg
@@ -0,0 +1,68 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.exact"
+rankprofile[0].fef.property[0].value "expdecay(100,12.50)"
+rankprofile[0].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.exact"
+rankprofile[0].fef.property[1].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[2].name "nativeProximity.proximityTable.exact"
+rankprofile[0].fef.property[2].value "expdecay(5000,3)"
+rankprofile[0].fef.property[3].name "nativeProximity.reverseProximityTable.exact"
+rankprofile[0].fef.property[3].value "expdecay(3000,3)"
+rankprofile[0].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[0].fef.property[4].value "expdecay(8000,12.50)"
+rankprofile[0].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[0].fef.property[5].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[6].name "nativeProximity.proximityTable.title"
+rankprofile[0].fef.property[6].value "expdecay(500,3)"
+rankprofile[0].fef.property[7].name "nativeProximity.reverseProximityTable.title"
+rankprofile[0].fef.property[7].value "expdecay(400,3)"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "experimental"
+rankprofile[2].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.exact"
+rankprofile[2].fef.property[0].value "expdecay(100,12.50)"
+rankprofile[2].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.exact"
+rankprofile[2].fef.property[1].value "loggrowth(1500,4000,19)"
+rankprofile[2].fef.property[2].name "nativeProximity.proximityTable.exact"
+rankprofile[2].fef.property[2].value "expdecay(5000,3)"
+rankprofile[2].fef.property[3].name "nativeProximity.reverseProximityTable.exact"
+rankprofile[2].fef.property[3].value "expdecay(3000,3)"
+rankprofile[2].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[2].fef.property[4].value "expdecay(8000,12.50)"
+rankprofile[2].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[2].fef.property[5].value "loggrowth(1500,4000,19)"
+rankprofile[2].fef.property[6].name "nativeProximity.proximityTable.title"
+rankprofile[2].fef.property[6].value "expdecay(500,3)"
+rankprofile[2].fef.property[7].name "nativeProximity.reverseProximityTable.title"
+rankprofile[2].fef.property[7].value "expdecay(400,3)"
+rankprofile[3].name "other"
+rankprofile[3].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.source"
+rankprofile[3].fef.property[0].value "expdecay(100,12.50)"
+rankprofile[3].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.source"
+rankprofile[3].fef.property[1].value "loggrowth(1500,4000,19)"
+rankprofile[3].fef.property[2].name "nativeProximity.proximityTable.source"
+rankprofile[3].fef.property[2].value "expdecay(5000,3)"
+rankprofile[3].fef.property[3].name "nativeProximity.reverseProximityTable.source"
+rankprofile[3].fef.property[3].value "expdecay(3000,3)"
+rankprofile[3].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.exact"
+rankprofile[3].fef.property[4].value "expdecay(100,12.50)"
+rankprofile[3].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.exact"
+rankprofile[3].fef.property[5].value "loggrowth(1500,4000,19)"
+rankprofile[3].fef.property[6].name "nativeProximity.proximityTable.exact"
+rankprofile[3].fef.property[6].value "expdecay(5000,3)"
+rankprofile[3].fef.property[7].name "nativeProximity.reverseProximityTable.exact"
+rankprofile[3].fef.property[7].value "expdecay(3000,3)"
+rankprofile[3].fef.property[8].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[3].fef.property[8].value "expdecay(8000,12.50)"
+rankprofile[3].fef.property[9].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[3].fef.property[9].value "loggrowth(1500,4000,19)"
+rankprofile[3].fef.property[10].name "nativeProximity.proximityTable.title"
+rankprofile[3].fef.property[10].value "expdecay(500,3)"
+rankprofile[3].fef.property[11].name "nativeProximity.reverseProximityTable.title"
+rankprofile[3].fef.property[11].value "expdecay(400,3)"
diff --git a/config-model/src/test/derived/complex/summary.cfg b/config-model/src/test/derived/complex/summary.cfg
new file mode 100644
index 00000000000..1cf6ad457b3
--- /dev/null
+++ b/config-model/src/test/derived/complex/summary.cfg
@@ -0,0 +1,43 @@
+defaultsummaryid 1506848752
+classes[0].id 1506848752
+classes[0].name "default"
+classes[0].fields[0].name "woe"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "exact"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "title"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "dyntitle"
+classes[0].fields[3].type "longstring"
+classes[0].fields[4].name "source"
+classes[0].fields[4].type "longstring"
+classes[0].fields[5].name "stringfield"
+classes[0].fields[5].type "longstring"
+classes[0].fields[6].name "rankfeatures"
+classes[0].fields[6].type "featuredata"
+classes[0].fields[7].name "summaryfeatures"
+classes[0].fields[7].type "featuredata"
+classes[0].fields[8].name "documentid"
+classes[0].fields[8].type "longstring"
+classes[1].id 28214929
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "year_sub"
+classes[1].fields[0].type "integer"
+classes[1].fields[1].name "prefixenabled"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "fleeting"
+classes[1].fields[2].type "jsonstring"
+classes[1].fields[3].name "fleeting2"
+classes[1].fields[3].type "float"
+classes[1].fields[4].name "foundat"
+classes[1].fields[4].type "int64"
+classes[1].fields[5].name "collapseby"
+classes[1].fields[5].type "integer"
+classes[1].fields[6].name "ts"
+classes[1].fields[6].type "int64"
+classes[1].fields[7].name "combineda"
+classes[1].fields[7].type "integer"
+classes[1].fields[8].name "rankfeatures"
+classes[1].fields[8].type "featuredata"
+classes[1].fields[9].name "summaryfeatures"
+classes[1].fields[9].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/complex/summarymap.cfg b/config-model/src/test/derived/complex/summarymap.cfg
new file mode 100644
index 00000000000..37721347b1c
--- /dev/null
+++ b/config-model/src/test/derived/complex/summarymap.cfg
@@ -0,0 +1,34 @@
+defaultoutputclass -1
+override[0].field "dyntitle"
+override[0].command "dynamicteaser"
+override[0].arguments "dyntitle"
+override[1].field "rankfeatures"
+override[1].command "rankfeatures"
+override[1].arguments ""
+override[2].field "summaryfeatures"
+override[2].command "summaryfeatures"
+override[2].arguments ""
+override[3].field "year_sub"
+override[3].command "attribute"
+override[3].arguments "year_sub"
+override[4].field "prefixenabled"
+override[4].command "attribute"
+override[4].arguments "prefixenabled"
+override[5].field "fleeting"
+override[5].command "attribute"
+override[5].arguments "fleeting"
+override[6].field "fleeting2"
+override[6].command "attribute"
+override[6].arguments "fleeting2"
+override[7].field "foundat"
+override[7].command "attribute"
+override[7].arguments "foundat"
+override[8].field "collapseby"
+override[8].command "attribute"
+override[8].arguments "collapseby"
+override[9].field "ts"
+override[9].command "attribute"
+override[9].arguments "ts"
+override[10].field "combineda"
+override[10].command "attribute"
+override[10].arguments "combineda" \ No newline at end of file
diff --git a/config-model/src/test/derived/deriver/child.sd b/config-model/src/test/derived/deriver/child.sd
new file mode 100644
index 00000000000..ba2f5637019
--- /dev/null
+++ b/config-model/src/test/derived/deriver/child.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+
+ document child inherits parent {
+
+ field a type string {
+ indexing: index | summary | attribute
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/deriver/grandparent.sd b/config-model/src/test/derived/deriver/grandparent.sd
new file mode 100644
index 00000000000..7247b2126f1
--- /dev/null
+++ b/config-model/src/test/derived/deriver/grandparent.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search grandparent {
+
+ document grandparent {
+
+ field c type string {
+ indexing: index
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/deriver/ilscripts.cfg b/config-model/src/test/derived/deriver/ilscripts.cfg
new file mode 100644
index 00000000000..749474dc350
--- /dev/null
+++ b/config-model/src/test/derived/deriver/ilscripts.cfg
@@ -0,0 +1,8 @@
+ilscript[1]
+ilscript[child].name "child"
+ilscript[child].doctype "child"
+ilscript[child].content[4]
+ilscript[child].content[0] "\"child\" | index sddocname | summary sddocname"
+ilscript[child].content[1] "input c | tokenize normalize stem:\"SHORTEST\" | index c"
+ilscript[child].content[2] "input b | tokenize normalize stem:\"SHORTEST\" | index b | summary b"
+ilscript[child].content[3] "input a | tokenize normalize stem:\"SHORTEST\" | index a | attribute a"
diff --git a/config-model/src/test/derived/deriver/parent.sd b/config-model/src/test/derived/deriver/parent.sd
new file mode 100644
index 00000000000..57a3438cb7d
--- /dev/null
+++ b/config-model/src/test/derived/deriver/parent.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+
+ document parent inherits grandparent {
+
+ field b type string {
+ indexing: index | summary
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/documentderiver/compression_body.sd b/config-model/src/test/derived/documentderiver/compression_body.sd
new file mode 100644
index 00000000000..f70dcce9c72
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/compression_body.sd
@@ -0,0 +1,20 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search compressed_body {
+
+ document compressed_body {
+ body {
+ compression {
+ level:6
+ }
+ }
+
+ field from type string {
+ }
+
+ field content type string {
+ body
+ }
+ }
+
+}
+
diff --git a/config-model/src/test/derived/documentderiver/compression_both.sd b/config-model/src/test/derived/documentderiver/compression_both.sd
new file mode 100644
index 00000000000..5c93f41b9a3
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/compression_both.sd
@@ -0,0 +1,26 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search compressed_both {
+
+ document compressed_both {
+ compression {
+ threshold:90
+ level:9
+ }
+
+ header {
+ compression {
+ threshold:50
+ level:6
+ }
+ }
+
+ field from type string {
+ }
+
+ field content type string {
+ body
+ }
+ }
+
+}
+
diff --git a/config-model/src/test/derived/documentderiver/compression_header.sd b/config-model/src/test/derived/documentderiver/compression_header.sd
new file mode 100644
index 00000000000..8eddbd0aa0d
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/compression_header.sd
@@ -0,0 +1,20 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search compressed_header {
+
+ document compressed_header {
+ header {
+ compression {
+ level:9
+ }
+ }
+
+ field from type string {
+ }
+
+ field content type string {
+ body
+ }
+ }
+
+}
+
diff --git a/config-model/src/test/derived/documentderiver/documentmanager.cfg b/config-model/src/test/derived/documentderiver/documentmanager.cfg
new file mode 100644
index 00000000000..d56d90ba358
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/documentmanager.cfg
@@ -0,0 +1,319 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -843666531
+datatype[1].structtype[0].name "compressed_body.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "from"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 1704844530
+datatype[2].structtype[0].name "compressed_body.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype LZ4
+datatype[2].structtype[0].compresslevel 6
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 0
+datatype[2].structtype[0].field[0].name "content"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[3].id 1417245026
+datatype[3].documenttype[0].name "compressed_body"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -843666531
+datatype[3].documenttype[0].bodystruct 1704844530
+datatype[4].id -484354914
+datatype[4].structtype[0].name "compressed_both.header"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype LZ4
+datatype[4].structtype[0].compresslevel 6
+datatype[4].structtype[0].compressthreshold 50
+datatype[4].structtype[0].compressminsize 0
+datatype[4].structtype[0].field[0].name "from"
+datatype[4].structtype[0].field[0].datatype 2
+datatype[5].id -1007627725
+datatype[5].structtype[0].name "compressed_both.body"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype LZ4
+datatype[5].structtype[0].compresslevel 9
+datatype[5].structtype[0].compressthreshold 90
+datatype[5].structtype[0].compressminsize 0
+datatype[5].structtype[0].field[0].name "content"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[6].id 1417705345
+datatype[6].documenttype[0].name "compressed_both"
+datatype[6].documenttype[0].version 0
+datatype[6].documenttype[0].inherits[0].name "document"
+datatype[6].documenttype[0].inherits[0].version 0
+datatype[6].documenttype[0].headerstruct -484354914
+datatype[6].documenttype[0].bodystruct -1007627725
+datatype[7].id -940182894
+datatype[7].structtype[0].name "compressed_header.header"
+datatype[7].structtype[0].version 0
+datatype[7].structtype[0].compresstype LZ4
+datatype[7].structtype[0].compresslevel 9
+datatype[7].structtype[0].compressthreshold 95
+datatype[7].structtype[0].compressminsize 0
+datatype[7].structtype[0].field[0].name "from"
+datatype[7].structtype[0].field[0].datatype 2
+datatype[8].id -579052249
+datatype[8].structtype[0].name "compressed_header.body"
+datatype[8].structtype[0].version 0
+datatype[8].structtype[0].compresstype NONE
+datatype[8].structtype[0].compresslevel 0
+datatype[8].structtype[0].compressthreshold 95
+datatype[8].structtype[0].compressminsize 800
+datatype[8].structtype[0].field[0].name "content"
+datatype[8].structtype[0].field[0].datatype 2
+datatype[9].id 1946084365
+datatype[9].documenttype[0].name "compressed_header"
+datatype[9].documenttype[0].version 0
+datatype[9].documenttype[0].inherits[0].name "document"
+datatype[9].documenttype[0].inherits[0].version 0
+datatype[9].documenttype[0].headerstruct -940182894
+datatype[9].documenttype[0].bodystruct -579052249
+datatype[10].id -88808602
+datatype[10].structtype[0].name "mail.header"
+datatype[10].structtype[0].version 0
+datatype[10].structtype[0].compresstype NONE
+datatype[10].structtype[0].compresslevel 0
+datatype[10].structtype[0].compressthreshold 95
+datatype[10].structtype[0].compressminsize 800
+datatype[10].structtype[0].field[0].name "URI"
+datatype[10].structtype[0].field[0].datatype 10
+datatype[10].structtype[0].field[1].name "mailid"
+datatype[10].structtype[0].field[1].datatype 2
+datatype[10].structtype[0].field[2].name "date"
+datatype[10].structtype[0].field[2].datatype 0
+datatype[10].structtype[0].field[3].name "from"
+datatype[10].structtype[0].field[3].datatype 2
+datatype[10].structtype[0].field[4].name "replyto"
+datatype[10].structtype[0].field[4].datatype 3
+datatype[10].structtype[0].field[5].name "to"
+datatype[10].structtype[0].field[5].datatype 2
+datatype[10].structtype[0].field[6].name "cc"
+datatype[10].structtype[0].field[6].datatype 2
+datatype[10].structtype[0].field[7].name "bcc"
+datatype[10].structtype[0].field[7].datatype 2
+datatype[10].structtype[0].field[8].name "subject"
+datatype[10].structtype[0].field[8].datatype 2
+datatype[11].id -1244861287
+datatype[11].arraytype[0].datatype 3
+datatype[12].id -953584901
+datatype[12].structtype[0].name "mail.body"
+datatype[12].structtype[0].version 0
+datatype[12].structtype[0].compresstype NONE
+datatype[12].structtype[0].compresslevel 0
+datatype[12].structtype[0].compressthreshold 95
+datatype[12].structtype[0].compressminsize 800
+datatype[12].structtype[0].field[0].name "mailbody"
+datatype[12].structtype[0].field[0].datatype 3
+datatype[12].structtype[0].field[1].name "attachmentcount"
+datatype[12].structtype[0].field[1].datatype 0
+datatype[12].structtype[0].field[2].name "attachmentnames"
+datatype[12].structtype[0].field[2].datatype 2
+datatype[12].structtype[0].field[3].name "attachmenttypes"
+datatype[12].structtype[0].field[3].datatype 2
+datatype[12].structtype[0].field[4].name "attachmentlanguages"
+datatype[12].structtype[0].field[4].datatype 2
+datatype[12].structtype[0].field[5].name "attachmentcontent"
+datatype[12].structtype[0].field[5].datatype 2
+datatype[12].structtype[0].field[6].name "attachments"
+datatype[12].structtype[0].field[6].datatype -1244861287
+datatype[13].id -1081574983
+datatype[13].documenttype[0].name "mail"
+datatype[13].documenttype[0].version 0
+datatype[13].documenttype[0].inherits[0].name "document"
+datatype[13].documenttype[0].inherits[0].version 0
+datatype[13].documenttype[0].headerstruct -88808602
+datatype[13].documenttype[0].bodystruct -953584901
+datatype[14].id -1486737430
+datatype[14].arraytype[0].datatype 2
+datatype[15].id 519906144
+datatype[15].weightedsettype[0].datatype 0
+datatype[15].weightedsettype[0].createifnonexistant false
+datatype[15].weightedsettype[0].removeifzero false
+datatype[16].id 363959257
+datatype[16].weightedsettype[0].datatype 0
+datatype[16].weightedsettype[0].createifnonexistant true
+datatype[16].weightedsettype[0].removeifzero true
+datatype[17].id -1910204744
+datatype[17].structtype[0].name "music.header"
+datatype[17].structtype[0].version 0
+datatype[17].structtype[0].compresstype NONE
+datatype[17].structtype[0].compresslevel 0
+datatype[17].structtype[0].compressthreshold 95
+datatype[17].structtype[0].compressminsize 800
+datatype[17].structtype[0].field[0].name "url"
+datatype[17].structtype[0].field[0].datatype 10
+datatype[17].structtype[0].field[1].name "title"
+datatype[17].structtype[0].field[1].datatype 2
+datatype[17].structtype[0].field[2].name "artist"
+datatype[17].structtype[0].field[2].datatype 2
+datatype[17].structtype[0].field[3].name "year"
+datatype[17].structtype[0].field[3].datatype 0
+datatype[17].structtype[0].field[4].name "description"
+datatype[17].structtype[0].field[4].datatype 3
+datatype[17].structtype[0].field[5].name "tracks"
+datatype[17].structtype[0].field[5].datatype -1486737430
+datatype[17].structtype[0].field[6].name "popularity"
+datatype[17].structtype[0].field[6].datatype 519906144
+datatype[17].structtype[0].field[7].name "popularity2"
+datatype[17].structtype[0].field[7].datatype 363959257
+datatype[17].structtype[0].field[8].name "popularity3"
+datatype[17].structtype[0].field[8].datatype 363959257
+datatype[18].id 993120973
+datatype[18].structtype[0].name "music.body"
+datatype[18].structtype[0].version 0
+datatype[18].structtype[0].compresstype NONE
+datatype[18].structtype[0].compresslevel 0
+datatype[18].structtype[0].compressthreshold 95
+datatype[18].structtype[0].compressminsize 800
+datatype[19].id 1412693671
+datatype[19].documenttype[0].name "music"
+datatype[19].documenttype[0].version 0
+datatype[19].documenttype[0].inherits[0].name "document"
+datatype[19].documenttype[0].inherits[0].version 0
+datatype[19].documenttype[0].headerstruct -1910204744
+datatype[19].documenttype[0].bodystruct 993120973
+datatype[20].id 2006483754
+datatype[20].structtype[0].name "newssummary.header"
+datatype[20].structtype[0].version 0
+datatype[20].structtype[0].compresstype NONE
+datatype[20].structtype[0].compresslevel 0
+datatype[20].structtype[0].compressthreshold 95
+datatype[20].structtype[0].compressminsize 800
+datatype[20].structtype[0].field[0].name "title"
+datatype[20].structtype[0].field[0].datatype 2
+datatype[20].structtype[0].field[1].name "abstract"
+datatype[20].structtype[0].field[1].datatype 2
+datatype[20].structtype[0].field[2].name "sourcename"
+datatype[20].structtype[0].field[2].datatype 2
+datatype[20].structtype[0].field[3].name "providername"
+datatype[20].structtype[0].field[3].datatype 2
+datatype[20].structtype[0].field[4].name "thumburl"
+datatype[20].structtype[0].field[4].datatype 2
+datatype[20].structtype[0].field[5].name "thumbwidth"
+datatype[20].structtype[0].field[5].datatype 0
+datatype[20].structtype[0].field[6].name "thumbheight"
+datatype[20].structtype[0].field[6].datatype 0
+datatype[20].structtype[0].field[7].name "language"
+datatype[20].structtype[0].field[7].datatype 2
+datatype[20].structtype[0].field[8].name "crawldocid"
+datatype[20].structtype[0].field[8].datatype 2
+datatype[20].structtype[0].field[9].name "url"
+datatype[20].structtype[0].field[9].datatype 10
+datatype[20].structtype[0].field[10].name "sourceurl"
+datatype[20].structtype[0].field[10].datatype 10
+datatype[20].structtype[0].field[11].name "categories"
+datatype[20].structtype[0].field[11].datatype 2
+datatype[20].structtype[0].field[12].name "pubdate"
+datatype[20].structtype[0].field[12].datatype 4
+datatype[20].structtype[0].field[13].name "expdate"
+datatype[20].structtype[0].field[13].datatype 4
+datatype[20].structtype[0].field[14].name "fingerprint"
+datatype[20].structtype[0].field[14].datatype 0
+datatype[20].structtype[0].field[15].name "debug"
+datatype[20].structtype[0].field[15].datatype 2
+datatype[20].structtype[0].field[16].name "attributes"
+datatype[20].structtype[0].field[16].datatype 2
+datatype[20].structtype[0].field[17].name "searchcluster"
+datatype[20].structtype[0].field[17].datatype 2
+datatype[20].structtype[0].field[18].name "eustaticrank"
+datatype[20].structtype[0].field[18].datatype 0
+datatype[20].structtype[0].field[19].name "usstaticrank"
+datatype[20].structtype[0].field[19].datatype 0
+datatype[20].structtype[0].field[20].name "asiastaticrank"
+datatype[20].structtype[0].field[20].datatype 0
+datatype[21].id -2059783233
+datatype[21].structtype[0].name "newssummary.body"
+datatype[21].structtype[0].version 0
+datatype[21].structtype[0].compresstype NONE
+datatype[21].structtype[0].compresslevel 0
+datatype[21].structtype[0].compressthreshold 95
+datatype[21].structtype[0].compressminsize 800
+datatype[22].id -756330891
+datatype[22].documenttype[0].name "newssummary"
+datatype[22].documenttype[0].version 0
+datatype[22].documenttype[0].inherits[0].name "document"
+datatype[22].documenttype[0].inherits[0].version 0
+datatype[22].documenttype[0].headerstruct 2006483754
+datatype[22].documenttype[0].bodystruct -2059783233
+datatype[23].id 2098419674
+datatype[23].structtype[0].name "newsarticle.header"
+datatype[23].structtype[0].version 0
+datatype[23].structtype[0].compresstype NONE
+datatype[23].structtype[0].compresslevel 0
+datatype[23].structtype[0].compressthreshold 95
+datatype[23].structtype[0].compressminsize 800
+datatype[23].structtype[0].field[0].name "dynabstract"
+datatype[23].structtype[0].field[0].datatype 2
+datatype[23].structtype[0].field[1].name "othersourcenames"
+datatype[23].structtype[0].field[1].datatype 2
+datatype[23].structtype[0].field[2].name "author"
+datatype[23].structtype[0].field[2].datatype 2
+datatype[23].structtype[0].field[3].name "otherlanguages"
+datatype[23].structtype[0].field[3].datatype 2
+datatype[23].structtype[0].field[4].name "charset"
+datatype[23].structtype[0].field[4].datatype 2
+datatype[23].structtype[0].field[5].name "mimetype"
+datatype[23].structtype[0].field[5].datatype 2
+datatype[23].structtype[0].field[6].name "referrerurl"
+datatype[23].structtype[0].field[6].datatype 10
+datatype[23].structtype[0].field[7].name "sourcelocation"
+datatype[23].structtype[0].field[7].datatype 2
+datatype[23].structtype[0].field[8].name "sourcecountry"
+datatype[23].structtype[0].field[8].datatype 2
+datatype[23].structtype[0].field[9].name "sourcelocale"
+datatype[23].structtype[0].field[9].datatype 2
+datatype[23].structtype[0].field[10].name "sourcecontinent"
+datatype[23].structtype[0].field[10].datatype 2
+datatype[23].structtype[0].field[11].name "articlecountry"
+datatype[23].structtype[0].field[11].datatype 2
+datatype[23].structtype[0].field[12].name "articlelocale"
+datatype[23].structtype[0].field[12].datatype 2
+datatype[23].structtype[0].field[13].name "articlecontinent"
+datatype[23].structtype[0].field[13].datatype 2
+datatype[23].structtype[0].field[14].name "sourcerank"
+datatype[23].structtype[0].field[14].datatype 0
+datatype[23].structtype[0].field[15].name "crawldate"
+datatype[23].structtype[0].field[15].datatype 4
+datatype[23].structtype[0].field[16].name "indexdate"
+datatype[23].structtype[0].field[16].datatype 4
+datatype[23].structtype[0].field[17].name "procdate"
+datatype[23].structtype[0].field[17].datatype 4
+datatype[23].structtype[0].field[18].name "sourceid"
+datatype[23].structtype[0].field[18].datatype 0
+datatype[23].structtype[0].field[19].name "sourcefeedid"
+datatype[23].structtype[0].field[19].datatype 0
+datatype[24].id 197293167
+datatype[24].structtype[0].name "newsarticle.body"
+datatype[24].structtype[0].version 0
+datatype[24].structtype[0].compresstype NONE
+datatype[24].structtype[0].compresslevel 0
+datatype[24].structtype[0].compressthreshold 95
+datatype[24].structtype[0].compressminsize 800
+datatype[24].structtype[0].field[0].name "body"
+datatype[24].structtype[0].field[0].datatype 2
+datatype[25].id -1710661691
+datatype[25].documenttype[0].name "newsarticle"
+datatype[25].documenttype[0].version 0
+datatype[25].documenttype[0].inherits[0].name "document"
+datatype[25].documenttype[0].inherits[0].version 0
+datatype[25].documenttype[0].inherits[1].name "newssummary"
+datatype[25].documenttype[0].inherits[1].version 0
+datatype[25].documenttype[0].headerstruct 2098419674
+datatype[25].documenttype[0].bodystruct 197293167
diff --git a/config-model/src/test/derived/documentderiver/mail.sd b/config-model/src/test/derived/documentderiver/mail.sd
new file mode 100644
index 00000000000..77195a5273c
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/mail.sd
@@ -0,0 +1,112 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search mail {
+
+ stemming: none
+
+ document mail {
+
+ field URI type uri {
+ indexing: summary
+ summary-to: default, mailid
+ }
+
+ field mailid type string {
+ indexing: summary | index
+ match: prefix
+ summary-to: default, mailid
+ }
+
+ field date type int {
+ indexing: summary | attribute | index
+ match: prefix
+ }
+
+ field from type string {
+ indexing: summary | index
+ # index-to: from, sender, address, header, default, all
+ match: prefix
+ }
+
+ field replyto type raw {
+ indexing: summary | index
+ # index-to: replyto
+ match: prefix
+ }
+
+ field to type string {
+ indexing: summary | index
+ # index-to: to, recipient, address, header, default, all
+ match: prefix
+ }
+
+ field cc type string {
+ indexing: index
+ # index-to: cc, recipient, address, header, default, all
+ match: prefix
+ }
+
+ field bcc type string {
+ indexing: index
+ # index-to: bcc
+ match: prefix
+ }
+
+ field subject type string {
+ indexing: summary | index
+ # index-to: subject, header, default, all
+ match: prefix
+ }
+
+ field mailbody type raw {
+ indexing: summary | index
+ # index-to: mailbody, default, all
+ match: substring
+ body
+ }
+
+ field attachmentcount type int {
+ indexing: summary | index
+ body
+ }
+
+ field attachmentnames type string {
+ indexing: index
+ # index-to: attachmentname, all
+ body
+ }
+
+ field attachmenttypes type string {
+ indexing: index
+ # index-to: attachmenttype, all
+ body
+ }
+
+ field attachmentlanguages type string {
+ indexing: index
+ match: prefix
+ body
+ }
+
+ field attachmentcontent type string {
+ indexing: summary | index
+ # index-to: attachment, all
+ match: prefix
+ body
+ }
+
+ field attachments type raw[] {
+ body
+ }
+
+ }
+
+ document-summary default {
+ summary snippet type string {
+ dynamic
+ source: body, attachmentcontent
+ }
+
+ }
+
+}
+
diff --git a/config-model/src/test/derived/documentderiver/music.sd b/config-model/src/test/derived/documentderiver/music.sd
new file mode 100644
index 00000000000..83d5d648424
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/music.sd
@@ -0,0 +1,44 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search music {
+
+ document music {
+
+ # Link to album main page
+ field url type uri { }
+
+ # Title of album
+ field title type string { }
+
+ # Album artist
+ field artist type string { }
+
+ # Album production year
+ field year type int { }
+
+ # Album description - about the album
+ field description type raw { }
+
+ # Names of the album tracks
+ field tracks type array<string> { }
+
+ # How many have given this album the grade 0/1/2/3
+ field popularity type weightedset<int> { }
+
+ # How many have given this album the grade 0/1/2/3
+ field popularity2 type weightedset<int> {
+ weightedset: create-if-nonexistent
+ weightedset: remove-if-zero
+ }
+
+ # How many have given this album the grade 0/1/2/3
+ field popularity3 type weightedset<int> {
+ weightedset {
+ create-if-nonexistent
+ remove-if-zero
+ }
+ }
+
+ }
+
+}
+
diff --git a/config-model/src/test/derived/documentderiver/newsarticle.sd b/config-model/src/test/derived/documentderiver/newsarticle.sd
new file mode 100644
index 00000000000..9407eca0d18
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/newsarticle.sd
@@ -0,0 +1,126 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search newsarticle {
+
+ document newsarticle inherits newssummary {
+
+ field dynabstract type string {
+ indexing: summary
+ }
+
+ field body type string {
+ body
+ indexing: summary | index
+ # index-to: body, default
+ stemming: none
+ }
+
+ field othersourcenames type string {
+ indexing: summary | index
+ # index-to: othersourcenames, source
+ stemming: none
+ }
+
+ field author type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field otherlanguages type string {
+ indexing: summary | index
+ # index-to: languages
+ stemming: none
+ }
+
+ field charset type string {
+ indexing: summary
+ stemming: none
+ }
+
+ field mimetype type string {
+ indexing: summary
+ stemming: none
+ }
+
+ field referrerurl type uri {
+ indexing: summary | lowercase | tokenize | index
+ stemming: none
+ }
+
+ field sourcelocation type string {
+ indexing: summary | index
+ stemming: none
+ alias: location
+ }
+
+ field sourcecountry type string {
+ indexing: summary | index
+ stemming: none
+ # index-to: sourcecountry, sourcelocation
+ }
+
+ field sourcelocale type string {
+ indexing: summary | index
+ stemming: none
+ # index-to: sourcelocale, sourcelocation
+ }
+
+ field sourcecontinent type string {
+ indexing: summary | index
+ stemming: none
+ # index-to: sourcecontinent, sourcelocation
+ }
+
+ field articlecountry type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field articlelocale type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field articlecontinent type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field sourcerank type int {
+ indexing: summary | index | set_var tmpsourcerank
+ }
+
+ field crawldate type long {
+ indexing: summary | index
+ }
+
+ field indexdate type long {
+ indexing: now | summary | index
+ }
+
+ field procdate type long {
+ indexing: summary | index
+ }
+
+ field sourceid type int {
+ indexing: summary | index
+ }
+
+ field sourcefeedid type int {
+ indexing: summary | index
+ }
+
+ }
+
+ rank-profile date {
+ }
+
+ rank-profile usrank inherits default {
+ }
+
+ rank-profile eurank inherits default {
+ }
+
+ rank-profile asiarank inherits default {
+ }
+
+}
diff --git a/config-model/src/test/derived/documentderiver/newssummary.sd b/config-model/src/test/derived/documentderiver/newssummary.sd
new file mode 100644
index 00000000000..3492b95308e
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/newssummary.sd
@@ -0,0 +1,165 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search newssummary {
+
+ document newssummary {
+
+ field title type string {
+ indexing: summary | index
+ # index-to: title, titleabstract, default
+ stemming: none
+ alias: headline
+ }
+
+ field abstract type string {
+ indexing: summary | index
+ # index-to: abstract, titleabstract, default
+ stemming: none
+ }
+
+ field sourcename type string {
+ indexing: summary | index
+ # index-to: sourcename, source
+ stemming: none
+ }
+
+ field providername type string {
+ indexing: summary | index
+ # index-to: providername, source
+ stemming: none
+ alias: provider
+ }
+
+ field thumburl type string {
+ indexing: summary | lowercase | tokenize | index
+ stemming: none
+ }
+
+ field thumbwidth type int {
+ indexing: summary | index
+ }
+
+ field thumbheight type int {
+ indexing: summary | index
+ }
+
+ field language type string {
+ indexing: summary | index
+ # index-to: language, languages
+ stemming: none
+ }
+
+ field crawldocid type string {
+ indexing: summary
+ stemming: none
+ }
+
+ field url type uri {
+ indexing: summary | lowercase | tokenize | index
+ stemming: none
+ }
+
+ field sourceurl type uri {
+ indexing: summary | lowercase | tokenize | index
+ stemming: none
+ }
+
+ field categories type string {
+ indexing: summary | index
+ stemming: none
+ alias: category
+ alias: cat
+ }
+
+ field pubdate type long {
+ indexing: summary | index | attribute pubdate | set_var tmppubdate
+ alias: date
+ }
+
+ field expdate type long {
+ indexing: summary | index
+ }
+
+ field fingerprint type int {
+ indexing: summary | index
+ }
+
+ field debug type string {
+ indexing {
+
+ # Initialize variables used for superduper ranking
+ 0 | set_var superduperus | set_var superdupereu | set_var superduperasia;
+
+ input debug | lowercase | summary | normalize | tokenize | index;
+ input debug | lowercase | split ";" | for_each {
+ # Loop through each token in debug string
+ switch {
+ case "superduperus": 10 | set_var superduperus;
+ case "superdupereu": 10 | set_var superdupereu;
+ case "superduperasia": 10 | set_var superduperasia;
+ }
+ };
+ }
+ indexing-rewrite: none
+ stemming: none
+ }
+
+ field attributes type string {
+ indexing {
+
+ # Initialize variables used for superduper ranking
+ 1 | set_var superdupermod;
+
+ input attributes | lowercase | summary | normalize | tokenize | index;
+ input attributes | lowercase | split ";" | for_each {
+ # Loop through each token in attributes string
+ switch {
+
+ # De-rank PR articles using the following rules:
+ # 1. Set editedstaticrank to '1'
+ # 2. Subtract 2.5 hours (9000 seconds) from timestamp used in ranking
+ # 3. No superduper rank
+ case "typepr": 1 | set_var tmpsourcerank | get_var tmppubdate - 9000 | set_var tmppubdate | 0 | set_var superdupermod;
+ }
+ };
+ }
+ indexing-rewrite: none
+ stemming: none
+ }
+
+ field searchcluster type string {
+ indexing: summary
+ stemming: none
+ }
+
+ field eustaticrank type int {
+ indexing {
+ get_var tmpsourcerank * 4000 + get_var superdupereu * get_var superdupermod * 1000 + get_var tmppubdate * 0.5 | summary | index | attribute eustaticrank;
+ }
+ }
+
+ field usstaticrank type int {
+ indexing {
+ get_var tmpsourcerank * 4000 + get_var superduperus * get_var superdupermod * 1000 + get_var tmppubdate * 0.5 | summary | index | attribute usstaticrank;
+ }
+ }
+
+ field asiastaticrank type int {
+ indexing {
+ get_var tmpsourcerank * 4000 + get_var superduperasia * get_var superdupermod * 1000 + get_var tmppubdate * 0.5 | summary | index | attribute asiastaticrank;
+ }
+ }
+ }
+
+ rank-profile date {
+ }
+
+ rank-profile usrank inherits default {
+ }
+
+ rank-profile eurank inherits default {
+ }
+
+ rank-profile asiarank inherits default {
+ }
+
+}
diff --git a/config-model/src/test/derived/documentderiver/sombrero.sd b/config-model/src/test/derived/documentderiver/sombrero.sd
new file mode 100644
index 00000000000..c4f9e90c06c
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/sombrero.sd
@@ -0,0 +1,36 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search webdoc {
+ document webdoc {
+ #
+ # a simple key-value pair
+ #
+ struct keyvalue {
+ field key type string {}
+ field value type string {}
+ }
+
+ #
+ # tags have a name and an array of attributes
+ #
+ struct tagvalue {
+ field name type string {}
+ # todo: this should be a map of attributes, not an array
+ field attributes type array<keyvalue> {}
+ }
+
+ #
+ # wordforms are (kind, form, weight) triplets
+ # todo: "kind" should be an enum; check how enums are used.
+ #
+ struct wordform {
+ field kind type int {}
+ field form type string {}
+ field weight type float {}
+ }
+
+ #
+ # web documents have zero or more HTML source strings
+ #
+ field html type string {}
+ }
+}
diff --git a/config-model/src/test/derived/documentderiver/vsmfields.cfg b/config-model/src/test/derived/documentderiver/vsmfields.cfg
new file mode 100644
index 00000000000..34d4ac85315
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/vsmfields.cfg
@@ -0,0 +1,489 @@
+fieldspec[58]
+fieldspec[0].name sddocname
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 "exact"
+fieldspec[1].name title
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 ""
+fieldspec[2].name abstract
+fieldspec[2].searchmethod AUTOUTF8
+fieldspec[2].arg1 ""
+fieldspec[3].name sourcename
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 ""
+fieldspec[4].name providername
+fieldspec[4].searchmethod AUTOUTF8
+fieldspec[4].arg1 ""
+fieldspec[5].name thumburl
+fieldspec[5].searchmethod AUTOUTF8
+fieldspec[5].arg1 ""
+fieldspec[6].name thumbwidth
+fieldspec[6].searchmethod INT32
+fieldspec[6].arg1 ""
+fieldspec[7].name thumbheight
+fieldspec[7].searchmethod INT32
+fieldspec[7].arg1 ""
+fieldspec[8].name language
+fieldspec[8].searchmethod AUTOUTF8
+fieldspec[8].arg1 ""
+fieldspec[9].name crawldocid
+fieldspec[9].searchmethod AUTOUTF8
+fieldspec[9].arg1 ""
+fieldspec[10].name url
+fieldspec[10].searchmethod AUTOUTF8
+fieldspec[10].arg1 ""
+fieldspec[11].name sourceurl
+fieldspec[11].searchmethod AUTOUTF8
+fieldspec[11].arg1 ""
+fieldspec[12].name categories
+fieldspec[12].searchmethod AUTOUTF8
+fieldspec[12].arg1 ""
+fieldspec[13].name pubdate
+fieldspec[13].searchmethod INT64
+fieldspec[13].arg1 ""
+fieldspec[14].name expdate
+fieldspec[14].searchmethod INT64
+fieldspec[14].arg1 ""
+fieldspec[15].name fingerprint
+fieldspec[15].searchmethod INT32
+fieldspec[15].arg1 ""
+fieldspec[16].name debug
+fieldspec[16].searchmethod AUTOUTF8
+fieldspec[16].arg1 ""
+fieldspec[17].name attributes
+fieldspec[17].searchmethod AUTOUTF8
+fieldspec[17].arg1 ""
+fieldspec[18].name searchcluster
+fieldspec[18].searchmethod AUTOUTF8
+fieldspec[18].arg1 ""
+fieldspec[19].name eustaticrank
+fieldspec[19].searchmethod INT32
+fieldspec[19].arg1 ""
+fieldspec[20].name usstaticrank
+fieldspec[20].searchmethod INT32
+fieldspec[20].arg1 ""
+fieldspec[21].name asiastaticrank
+fieldspec[21].searchmethod INT32
+fieldspec[21].arg1 ""
+fieldspec[22].name dynabstract
+fieldspec[22].searchmethod AUTOUTF8
+fieldspec[22].arg1 ""
+fieldspec[23].name body
+fieldspec[23].searchmethod AUTOUTF8
+fieldspec[23].arg1 ""
+fieldspec[24].name othersourcenames
+fieldspec[24].searchmethod AUTOUTF8
+fieldspec[24].arg1 ""
+fieldspec[25].name author
+fieldspec[25].searchmethod AUTOUTF8
+fieldspec[25].arg1 ""
+fieldspec[26].name otherlanguages
+fieldspec[26].searchmethod AUTOUTF8
+fieldspec[26].arg1 ""
+fieldspec[27].name charset
+fieldspec[27].searchmethod AUTOUTF8
+fieldspec[27].arg1 ""
+fieldspec[28].name mimetype
+fieldspec[28].searchmethod AUTOUTF8
+fieldspec[28].arg1 ""
+fieldspec[29].name referrerurl
+fieldspec[29].searchmethod AUTOUTF8
+fieldspec[29].arg1 ""
+fieldspec[30].name sourcelocation
+fieldspec[30].searchmethod AUTOUTF8
+fieldspec[30].arg1 ""
+fieldspec[31].name sourcecountry
+fieldspec[31].searchmethod AUTOUTF8
+fieldspec[31].arg1 ""
+fieldspec[32].name sourcelocale
+fieldspec[32].searchmethod AUTOUTF8
+fieldspec[32].arg1 ""
+fieldspec[33].name sourcecontinent
+fieldspec[33].searchmethod AUTOUTF8
+fieldspec[33].arg1 ""
+fieldspec[34].name articlecountry
+fieldspec[34].searchmethod AUTOUTF8
+fieldspec[34].arg1 ""
+fieldspec[35].name articlelocale
+fieldspec[35].searchmethod AUTOUTF8
+fieldspec[35].arg1 ""
+fieldspec[36].name articlecontinent
+fieldspec[36].searchmethod AUTOUTF8
+fieldspec[36].arg1 ""
+fieldspec[37].name sourcerank
+fieldspec[37].searchmethod INT32
+fieldspec[37].arg1 ""
+fieldspec[38].name crawldate
+fieldspec[38].searchmethod INT64
+fieldspec[38].arg1 ""
+fieldspec[39].name indexdate
+fieldspec[39].searchmethod INT64
+fieldspec[39].arg1 ""
+fieldspec[40].name procdate
+fieldspec[40].searchmethod INT64
+fieldspec[40].arg1 ""
+fieldspec[41].name sourceid
+fieldspec[41].searchmethod INT32
+fieldspec[41].arg1 ""
+fieldspec[42].name sourcefeedid
+fieldspec[42].searchmethod INT32
+fieldspec[42].arg1 ""
+fieldspec[43].name URI
+fieldspec[43].searchmethod AUTOUTF8
+fieldspec[43].arg1 ""
+fieldspec[44].name mailid
+fieldspec[44].searchmethod AUTOUTF8
+fieldspec[44].arg1 "prefix"
+fieldspec[45].name date
+fieldspec[45].searchmethod INT32
+fieldspec[45].arg1 ""
+fieldspec[46].name from
+fieldspec[46].searchmethod AUTOUTF8
+fieldspec[46].arg1 "prefix"
+fieldspec[47].name replyto
+fieldspec[47].searchmethod AUTOUTF8
+fieldspec[47].arg1 "prefix"
+fieldspec[48].name to
+fieldspec[48].searchmethod AUTOUTF8
+fieldspec[48].arg1 "prefix"
+fieldspec[49].name cc
+fieldspec[49].searchmethod AUTOUTF8
+fieldspec[49].arg1 "prefix"
+fieldspec[50].name bcc
+fieldspec[50].searchmethod AUTOUTF8
+fieldspec[50].arg1 "prefix"
+fieldspec[51].name subject
+fieldspec[51].searchmethod AUTOUTF8
+fieldspec[51].arg1 "prefix"
+fieldspec[52].name mailbody
+fieldspec[52].searchmethod AUTOUTF8
+fieldspec[52].arg1 "substring"
+fieldspec[53].name attachmentcount
+fieldspec[53].searchmethod INT32
+fieldspec[53].arg1 ""
+fieldspec[54].name attachmentnames
+fieldspec[54].searchmethod AUTOUTF8
+fieldspec[54].arg1 ""
+fieldspec[55].name attachmenttypes
+fieldspec[55].searchmethod AUTOUTF8
+fieldspec[55].arg1 ""
+fieldspec[56].name attachmentlanguages
+fieldspec[56].searchmethod AUTOUTF8
+fieldspec[56].arg1 "prefix"
+fieldspec[57].name attachmentcontent
+fieldspec[57].searchmethod AUTOUTF8
+fieldspec[57].arg1 "prefix"
+documenttype[7]
+documenttype[0].name newssummary
+documenttype[0].index[24]
+documenttype[0].index[0].name sddocname
+documenttype[0].index[0].field[1]
+documenttype[0].index[0].field[0].name sddocname
+documenttype[0].index[1].name title
+documenttype[0].index[1].field[1]
+documenttype[0].index[1].field[0].name title
+documenttype[0].index[2].name titleabstract
+documenttype[0].index[2].field[2]
+documenttype[0].index[2].field[0].name title
+documenttype[0].index[2].field[1].name abstract
+documenttype[0].index[3].name default
+documenttype[0].index[3].field[2]
+documenttype[0].index[3].field[0].name title
+documenttype[0].index[3].field[1].name abstract
+documenttype[0].index[4].name abstract
+documenttype[0].index[4].field[1]
+documenttype[0].index[4].field[0].name abstract
+documenttype[0].index[5].name sourcename
+documenttype[0].index[5].field[1]
+documenttype[0].index[5].field[0].name sourcename
+documenttype[0].index[6].name source
+documenttype[0].index[6].field[2]
+documenttype[0].index[6].field[0].name sourcename
+documenttype[0].index[6].field[1].name providername
+documenttype[0].index[7].name providername
+documenttype[0].index[7].field[1]
+documenttype[0].index[7].field[0].name providername
+documenttype[0].index[8].name thumburl
+documenttype[0].index[8].field[1]
+documenttype[0].index[8].field[0].name thumburl
+documenttype[0].index[9].name thumbwidth
+documenttype[0].index[9].field[1]
+documenttype[0].index[9].field[0].name thumbwidth
+documenttype[0].index[10].name thumbheight
+documenttype[0].index[10].field[1]
+documenttype[0].index[10].field[0].name thumbheight
+documenttype[0].index[11].name language
+documenttype[0].index[11].field[1]
+documenttype[0].index[11].field[0].name language
+documenttype[0].index[12].name languages
+documenttype[0].index[12].field[1]
+documenttype[0].index[12].field[0].name language
+documenttype[0].index[13].name url
+documenttype[0].index[13].field[1]
+documenttype[0].index[13].field[0].name url
+documenttype[0].index[14].name sourceurl
+documenttype[0].index[14].field[1]
+documenttype[0].index[14].field[0].name sourceurl
+documenttype[0].index[15].name categories
+documenttype[0].index[15].field[1]
+documenttype[0].index[15].field[0].name categories
+documenttype[0].index[16].name pubdate
+documenttype[0].index[16].field[1]
+documenttype[0].index[16].field[0].name pubdate
+documenttype[0].index[17].name expdate
+documenttype[0].index[17].field[1]
+documenttype[0].index[17].field[0].name expdate
+documenttype[0].index[18].name fingerprint
+documenttype[0].index[18].field[1]
+documenttype[0].index[18].field[0].name fingerprint
+documenttype[0].index[19].name debug
+documenttype[0].index[19].field[1]
+documenttype[0].index[19].field[0].name debug
+documenttype[0].index[20].name attributes
+documenttype[0].index[20].field[1]
+documenttype[0].index[20].field[0].name attributes
+documenttype[0].index[21].name eustaticrank
+documenttype[0].index[21].field[1]
+documenttype[0].index[21].field[0].name eustaticrank
+documenttype[0].index[22].name usstaticrank
+documenttype[0].index[22].field[1]
+documenttype[0].index[22].field[0].name usstaticrank
+documenttype[0].index[23].name asiastaticrank
+documenttype[0].index[23].field[1]
+documenttype[0].index[23].field[0].name asiastaticrank
+documenttype[1].name newsarticle
+documenttype[1].index[41]
+documenttype[1].index[0].name sddocname
+documenttype[1].index[0].field[1]
+documenttype[1].index[0].field[0].name sddocname
+documenttype[1].index[1].name title
+documenttype[1].index[1].field[1]
+documenttype[1].index[1].field[0].name title
+documenttype[1].index[2].name titleabstract
+documenttype[1].index[2].field[2]
+documenttype[1].index[2].field[0].name title
+documenttype[1].index[2].field[1].name abstract
+documenttype[1].index[3].name default
+documenttype[1].index[3].field[3]
+documenttype[1].index[3].field[0].name title
+documenttype[1].index[3].field[1].name abstract
+documenttype[1].index[3].field[2].name body
+documenttype[1].index[4].name abstract
+documenttype[1].index[4].field[1]
+documenttype[1].index[4].field[0].name abstract
+documenttype[1].index[5].name sourcename
+documenttype[1].index[5].field[1]
+documenttype[1].index[5].field[0].name sourcename
+documenttype[1].index[6].name source
+documenttype[1].index[6].field[3]
+documenttype[1].index[6].field[0].name sourcename
+documenttype[1].index[6].field[1].name providername
+documenttype[1].index[6].field[2].name othersourcenames
+documenttype[1].index[7].name providername
+documenttype[1].index[7].field[1]
+documenttype[1].index[7].field[0].name providername
+documenttype[1].index[8].name thumburl
+documenttype[1].index[8].field[1]
+documenttype[1].index[8].field[0].name thumburl
+documenttype[1].index[9].name thumbwidth
+documenttype[1].index[9].field[1]
+documenttype[1].index[9].field[0].name thumbwidth
+documenttype[1].index[10].name thumbheight
+documenttype[1].index[10].field[1]
+documenttype[1].index[10].field[0].name thumbheight
+documenttype[1].index[11].name language
+documenttype[1].index[11].field[1]
+documenttype[1].index[11].field[0].name language
+documenttype[1].index[12].name languages
+documenttype[1].index[12].field[2]
+documenttype[1].index[12].field[0].name language
+documenttype[1].index[12].field[1].name otherlanguages
+documenttype[1].index[13].name url
+documenttype[1].index[13].field[1]
+documenttype[1].index[13].field[0].name url
+documenttype[1].index[14].name sourceurl
+documenttype[1].index[14].field[1]
+documenttype[1].index[14].field[0].name sourceurl
+documenttype[1].index[15].name categories
+documenttype[1].index[15].field[1]
+documenttype[1].index[15].field[0].name categories
+documenttype[1].index[16].name pubdate
+documenttype[1].index[16].field[1]
+documenttype[1].index[16].field[0].name pubdate
+documenttype[1].index[17].name expdate
+documenttype[1].index[17].field[1]
+documenttype[1].index[17].field[0].name expdate
+documenttype[1].index[18].name fingerprint
+documenttype[1].index[18].field[1]
+documenttype[1].index[18].field[0].name fingerprint
+documenttype[1].index[19].name debug
+documenttype[1].index[19].field[1]
+documenttype[1].index[19].field[0].name debug
+documenttype[1].index[20].name attributes
+documenttype[1].index[20].field[1]
+documenttype[1].index[20].field[0].name attributes
+documenttype[1].index[21].name eustaticrank
+documenttype[1].index[21].field[1]
+documenttype[1].index[21].field[0].name eustaticrank
+documenttype[1].index[22].name usstaticrank
+documenttype[1].index[22].field[1]
+documenttype[1].index[22].field[0].name usstaticrank
+documenttype[1].index[23].name asiastaticrank
+documenttype[1].index[23].field[1]
+documenttype[1].index[23].field[0].name asiastaticrank
+documenttype[1].index[24].name body
+documenttype[1].index[24].field[1]
+documenttype[1].index[24].field[0].name body
+documenttype[1].index[25].name othersourcenames
+documenttype[1].index[25].field[1]
+documenttype[1].index[25].field[0].name othersourcenames
+documenttype[1].index[26].name author
+documenttype[1].index[26].field[1]
+documenttype[1].index[26].field[0].name author
+documenttype[1].index[27].name referrerurl
+documenttype[1].index[27].field[1]
+documenttype[1].index[27].field[0].name referrerurl
+documenttype[1].index[28].name sourcelocation
+documenttype[1].index[28].field[4]
+documenttype[1].index[28].field[0].name sourcelocation
+documenttype[1].index[28].field[1].name sourcecountry
+documenttype[1].index[28].field[2].name sourcelocale
+documenttype[1].index[28].field[3].name sourcecontinent
+documenttype[1].index[29].name sourcecountry
+documenttype[1].index[29].field[1]
+documenttype[1].index[29].field[0].name sourcecountry
+documenttype[1].index[30].name sourcelocale
+documenttype[1].index[30].field[1]
+documenttype[1].index[30].field[0].name sourcelocale
+documenttype[1].index[31].name sourcecontinent
+documenttype[1].index[31].field[1]
+documenttype[1].index[31].field[0].name sourcecontinent
+documenttype[1].index[32].name articlecountry
+documenttype[1].index[32].field[1]
+documenttype[1].index[32].field[0].name articlecountry
+documenttype[1].index[33].name articlelocale
+documenttype[1].index[33].field[1]
+documenttype[1].index[33].field[0].name articlelocale
+documenttype[1].index[34].name articlecontinent
+documenttype[1].index[34].field[1]
+documenttype[1].index[34].field[0].name articlecontinent
+documenttype[1].index[35].name sourcerank
+documenttype[1].index[35].field[1]
+documenttype[1].index[35].field[0].name sourcerank
+documenttype[1].index[36].name crawldate
+documenttype[1].index[36].field[1]
+documenttype[1].index[36].field[0].name crawldate
+documenttype[1].index[37].name indexdate
+documenttype[1].index[37].field[1]
+documenttype[1].index[37].field[0].name indexdate
+documenttype[1].index[38].name procdate
+documenttype[1].index[38].field[1]
+documenttype[1].index[38].field[0].name procdate
+documenttype[1].index[39].name sourceid
+documenttype[1].index[39].field[1]
+documenttype[1].index[39].field[0].name sourceid
+documenttype[1].index[40].name sourcefeedid
+documenttype[1].index[40].field[1]
+documenttype[1].index[40].field[0].name sourcefeedid
+documenttype[2].name music
+documenttype[2].index[1]
+documenttype[2].index[0].name sddocname
+documenttype[2].index[0].field[1]
+documenttype[2].index[0].field[0].name sddocname
+documenttype[3].name mail
+documenttype[3].index[21]
+documenttype[3].index[0].name sddocname
+documenttype[3].index[0].field[1]
+documenttype[3].index[0].field[0].name sddocname
+documenttype[3].index[1].name mailid
+documenttype[3].index[1].field[1]
+documenttype[3].index[1].field[0].name mailid
+documenttype[3].index[2].name date
+documenttype[3].index[2].field[1]
+documenttype[3].index[2].field[0].name date
+documenttype[3].index[3].name from
+documenttype[3].index[3].field[1]
+documenttype[3].index[3].field[0].name from
+documenttype[3].index[4].name sender
+documenttype[3].index[4].field[1]
+documenttype[3].index[4].field[0].name from
+documenttype[3].index[5].name address
+documenttype[3].index[5].field[3]
+documenttype[3].index[5].field[0].name from
+documenttype[3].index[5].field[1].name to
+documenttype[3].index[5].field[2].name cc
+documenttype[3].index[6].name header
+documenttype[3].index[6].field[4]
+documenttype[3].index[6].field[0].name from
+documenttype[3].index[6].field[1].name to
+documenttype[3].index[6].field[2].name cc
+documenttype[3].index[6].field[3].name subject
+documenttype[3].index[7].name default
+documenttype[3].index[7].field[5]
+documenttype[3].index[7].field[0].name from
+documenttype[3].index[7].field[1].name to
+documenttype[3].index[7].field[2].name cc
+documenttype[3].index[7].field[3].name subject
+documenttype[3].index[7].field[4].name mailbody
+documenttype[3].index[8].name all
+documenttype[3].index[8].field[8]
+documenttype[3].index[8].field[0].name from
+documenttype[3].index[8].field[1].name to
+documenttype[3].index[8].field[2].name cc
+documenttype[3].index[8].field[3].name subject
+documenttype[3].index[8].field[4].name mailbody
+documenttype[3].index[8].field[5].name attachmentnames
+documenttype[3].index[8].field[6].name attachmenttypes
+documenttype[3].index[8].field[7].name attachmentcontent
+documenttype[3].index[9].name replyto
+documenttype[3].index[9].field[1]
+documenttype[3].index[9].field[0].name replyto
+documenttype[3].index[10].name to
+documenttype[3].index[10].field[1]
+documenttype[3].index[10].field[0].name to
+documenttype[3].index[11].name recipient
+documenttype[3].index[11].field[2]
+documenttype[3].index[11].field[0].name to
+documenttype[3].index[11].field[1].name cc
+documenttype[3].index[12].name cc
+documenttype[3].index[12].field[1]
+documenttype[3].index[12].field[0].name cc
+documenttype[3].index[13].name bcc
+documenttype[3].index[13].field[1]
+documenttype[3].index[13].field[0].name bcc
+documenttype[3].index[14].name subject
+documenttype[3].index[14].field[1]
+documenttype[3].index[14].field[0].name subject
+documenttype[3].index[15].name mailbody
+documenttype[3].index[15].field[1]
+documenttype[3].index[15].field[0].name mailbody
+documenttype[3].index[16].name attachmentcount
+documenttype[3].index[16].field[1]
+documenttype[3].index[16].field[0].name attachmentcount
+documenttype[3].index[17].name attachmentname
+documenttype[3].index[17].field[1]
+documenttype[3].index[17].field[0].name attachmentnames
+documenttype[3].index[18].name attachmenttype
+documenttype[3].index[18].field[1]
+documenttype[3].index[18].field[0].name attachmenttypes
+documenttype[3].index[19].name attachmentlanguages
+documenttype[3].index[19].field[1]
+documenttype[3].index[19].field[0].name attachmentlanguages
+documenttype[3].index[20].name attachment
+documenttype[3].index[20].field[1]
+documenttype[3].index[20].field[0].name attachmentcontent
+documenttype[4].name compressed_header
+documenttype[4].index[1]
+documenttype[4].index[0].name sddocname
+documenttype[4].index[0].field[1]
+documenttype[4].index[0].field[0].name sddocname
+documenttype[5].name compressed_both
+documenttype[5].index[1]
+documenttype[5].index[0].name sddocname
+documenttype[5].index[0].field[1]
+documenttype[5].index[0].field[0].name sddocname
+documenttype[6].name compressed_body
+documenttype[6].index[1]
+documenttype[6].index[0].name sddocname
+documenttype[6].index[0].field[1]
+documenttype[6].index[0].field[0].name sddocname
diff --git a/config-model/src/test/derived/documentderiver/vsmsummary.cfg b/config-model/src/test/derived/documentderiver/vsmsummary.cfg
new file mode 100644
index 00000000000..5f9882e8c1b
--- /dev/null
+++ b/config-model/src/test/derived/documentderiver/vsmsummary.cfg
@@ -0,0 +1,6 @@
+fieldmap[1]
+fieldmap[0].summary snippet
+fieldmap[0].document[2]
+fieldmap[0].document[0].field body
+fieldmap[0].document[1].field attachmentcontent
+fieldmap[0].command FLATTENJUNIPER \ No newline at end of file
diff --git a/config-model/src/test/derived/emptychild/child.sd b/config-model/src/test/derived/emptychild/child.sd
new file mode 100644
index 00000000000..2e2423b91d6
--- /dev/null
+++ b/config-model/src/test/derived/emptychild/child.sd
@@ -0,0 +1,5 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+ document child inherits parent {
+ }
+}
diff --git a/config-model/src/test/derived/emptychild/parent.sd b/config-model/src/test/derived/emptychild/parent.sd
new file mode 100644
index 00000000000..69d48de8f75
--- /dev/null
+++ b/config-model/src/test/derived/emptychild/parent.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+ document parent {
+ field a1 type string {
+ indexing: attribute | summary
+ }
+ }
+}
diff --git a/config-model/src/test/derived/emptychild/summary.cfg b/config-model/src/test/derived/emptychild/summary.cfg
new file mode 100644
index 00000000000..b8b56eea8f5
--- /dev/null
+++ b/config-model/src/test/derived/emptychild/summary.cfg
@@ -0,0 +1,19 @@
+defaultsummaryid 1814603381
+classes[0].id 1814603381
+classes[0].name "default"
+classes[0].fields[0].name "a1"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "rankfeatures"
+classes[0].fields[1].type "featuredata"
+classes[0].fields[2].name "summaryfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "documentid"
+classes[0].fields[3].type "longstring"
+classes[1].id 1490368133
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "a1"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].type "featuredata"
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/emptydefault/attributes.cfg b/config-model/src/test/derived/emptydefault/attributes.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/attributes.cfg
diff --git a/config-model/src/test/derived/emptydefault/documentmanager.cfg b/config-model/src/test/derived/emptydefault/documentmanager.cfg
new file mode 100644
index 00000000000..4235199342a
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/documentmanager.cfg
@@ -0,0 +1,43 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 461724009
+datatype[1].structtype[0].name "emptydefault.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "one"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "two"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "rankfeatures"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[3].name "summaryfeatures"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[2].id 311791038
+datatype[2].structtype[0].name "emptydefault.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id -1663995626
+datatype[3].documenttype[0].name "emptydefault"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct 461724009
+datatype[3].documenttype[0].bodystruct 311791038
+datatype[3].documenttype[0].fieldsets{[document]}.fields[0] "one"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[1] "two"
diff --git a/config-model/src/test/derived/emptydefault/emptydefault.sd b/config-model/src/test/derived/emptydefault/emptydefault.sd
new file mode 100644
index 00000000000..14c83003079
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/emptydefault.sd
@@ -0,0 +1,16 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search emptydefault {
+
+ document emptydefault {
+
+ field one type string {
+ indexing: index
+ }
+
+ field two type string {
+ indexing: index
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/emptydefault/ilscripts.cfg b/config-model/src/test/derived/emptydefault/ilscripts.cfg
new file mode 100644
index 00000000000..b28b5ade17f
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/ilscripts.cfg
@@ -0,0 +1,6 @@
+maxtermoccurrences 100
+ilscript[0].doctype "emptydefault"
+ilscript[0].docfield[0] "one"
+ilscript[0].docfield[1] "two"
+ilscript[0].content[0] "clear_state | guard { input one | tokenize normalize stem:\"SHORTEST\" | index one; }"
+ilscript[0].content[1] "clear_state | guard { input two | tokenize normalize stem:\"SHORTEST\" | index two; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/emptydefault/index-info.cfg b/config-model/src/test/derived/emptydefault/index-info.cfg
new file mode 100644
index 00000000000..0ec9439e13b
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/index-info.cfg
@@ -0,0 +1,25 @@
+indexinfo[0].name "emptydefault"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "one"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "one"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "one"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "one"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "two"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "two"
+indexinfo[0].command[7].command "lowercase"
+indexinfo[0].command[8].indexname "two"
+indexinfo[0].command[8].command "stem:SHORTEST"
+indexinfo[0].command[9].indexname "two"
+indexinfo[0].command[9].command "normalize"
+indexinfo[0].command[10].indexname "rankfeatures"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "summaryfeatures"
+indexinfo[0].command[11].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/emptydefault/rank-profiles.cfg b/config-model/src/test/derived/emptydefault/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/emptydefault/summary.cfg b/config-model/src/test/derived/emptydefault/summary.cfg
new file mode 100644
index 00000000000..788f02babfc
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/summary.cfg
@@ -0,0 +1,9 @@
+defaultsummaryid 1151071433
+classes[0].id 1151071433
+classes[0].name "default"
+classes[0].fields[0].name "rankfeatures"
+classes[0].fields[0].type "featuredata"
+classes[0].fields[1].name "summaryfeatures"
+classes[0].fields[1].type "featuredata"
+classes[0].fields[2].name "documentid"
+classes[0].fields[2].type "longstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/emptydefault/summarymap.cfg b/config-model/src/test/derived/emptydefault/summarymap.cfg
new file mode 100644
index 00000000000..42b6e811ee6
--- /dev/null
+++ b/config-model/src/test/derived/emptydefault/summarymap.cfg
@@ -0,0 +1,7 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/exactmatch/exactmatch.sd b/config-model/src/test/derived/exactmatch/exactmatch.sd
new file mode 100644
index 00000000000..9eaea3654a7
--- /dev/null
+++ b/config-model/src/test/derived/exactmatch/exactmatch.sd
@@ -0,0 +1,21 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search exactmatch {
+
+ document exactmatch {
+
+ field tag type string {
+ indexing: summary | index
+ match: exact
+ }
+
+ field screweduserids type string {
+ indexing: index | summary | attribute
+ match {
+ exact
+ exact-terminator: "*!!!*"
+ }
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/exactmatch/ilscripts.cfg b/config-model/src/test/derived/exactmatch/ilscripts.cfg
new file mode 100644
index 00000000000..c3ecab6d3a9
--- /dev/null
+++ b/config-model/src/test/derived/exactmatch/ilscripts.cfg
@@ -0,0 +1,6 @@
+maxtermoccurrences 100
+ilscript[0].doctype "exactmatch"
+ilscript[0].docfield[0] "tag"
+ilscript[0].docfield[1] "screweduserids"
+ilscript[0].content[0] "clear_state | guard { input tag | exact | summary tag | index tag; }"
+ilscript[0].content[1] "clear_state | guard { input screweduserids | exact | index screweduserids | summary screweduserids | attribute screweduserids; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/exactmatch/index-info.cfg b/config-model/src/test/derived/exactmatch/index-info.cfg
new file mode 100644
index 00000000000..aeece43832d
--- /dev/null
+++ b/config-model/src/test/derived/exactmatch/index-info.cfg
@@ -0,0 +1,21 @@
+indexinfo[0].name "exactmatch"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "tag"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "tag"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "tag"
+indexinfo[0].command[4].command "exact @@"
+indexinfo[0].command[5].indexname "screweduserids"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "screweduserids"
+indexinfo[0].command[6].command "lowercase"
+indexinfo[0].command[7].indexname "screweduserids"
+indexinfo[0].command[7].command "exact *!!!*"
+indexinfo[0].command[8].indexname "rankfeatures"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "summaryfeatures"
+indexinfo[0].command[9].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/fieldlength/attributes.cfg b/config-model/src/test/derived/fieldlength/attributes.cfg
new file mode 100644
index 00000000000..29fd2f986f0
--- /dev/null
+++ b/config-model/src/test/derived/fieldlength/attributes.cfg
@@ -0,0 +1,4 @@
+attribute[1]
+attribute[0].name "year"
+attribute[0].datatype INT32
+attribute[0].collectiontype SINGLE
diff --git a/config-model/src/test/derived/fieldlength/fieldlength.sd b/config-model/src/test/derived/fieldlength/fieldlength.sd
new file mode 100644
index 00000000000..df42b822dc2
--- /dev/null
+++ b/config-model/src/test/derived/fieldlength/fieldlength.sd
@@ -0,0 +1,73 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search fieldlength {
+
+ document fieldlength {
+
+ field artist type string {
+ indexing: summary | index
+ # index-to: default
+ }
+
+ field title type string {
+ indexing: summary | index
+ # index-to: default
+ }
+
+ field song type string {
+ indexing: summary | index
+ # index-to: all, song
+ }
+
+ field album type string {
+ indexing: summary | index
+ # index-to: all, album, all2
+ }
+
+ field composer type string {
+ indexing: summary | index
+ # index-to: all, composer, all2
+ }
+
+ field label type string {
+ indexing: summary | index
+ }
+
+ field year type int {
+ indexing: summary | attribute
+ }
+
+ }
+
+ rank-profile default {
+ first-phase {
+ expression: classicRank
+ }
+ second-phase {
+ expression: if(3>2,4,2)
+ rerank-count: 10
+ }
+ rank-features: attribute(baz).out sum(value(3))
+ rank-features: classicRank
+ ignore-default-rank-features
+
+ rank-properties {
+ foo: "bar, baz"
+ qux: "quux"
+ foo: "foobar"
+ }
+
+ }
+
+ rank-profile static {
+ first-phase {
+ expression: attribute
+ }
+ second-phase {
+ expression: file:../rankexpression/rankexpression
+ }
+ summary-features: sum(value(1),value(2))
+ }
+
+}
+
+
diff --git a/config-model/src/test/derived/flickr/flickrphotos.sd b/config-model/src/test/derived/flickr/flickrphotos.sd
new file mode 100755
index 00000000000..8a2232ad2b0
--- /dev/null
+++ b/config-model/src/test/derived/flickr/flickrphotos.sd
@@ -0,0 +1,24 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search flickrphotos{
+
+ #Document summary to use for attribute-prefetching with many hits
+
+ document-summary mapcluster {
+ summary distance type int {}
+ }
+
+ document flickrphotos{
+
+
+ field loc type string{
+ indexing: summary | to_pos | attribute
+ }
+
+ }
+
+
+
+
+
+}#end flickrphotos cluster
+
diff --git a/config-model/src/test/derived/gemini2/gemini.sd b/config-model/src/test/derived/gemini2/gemini.sd
new file mode 100644
index 00000000000..cfa85d0e2a9
--- /dev/null
+++ b/config-model/src/test/derived/gemini2/gemini.sd
@@ -0,0 +1,27 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search gemini {
+
+ document gemini {
+ }
+
+ rank-profile test {
+
+ macro wrapper2(x) {
+ expression: x
+ }
+
+ macro wrapper1(x) {
+ expression: wrapper2(x)
+ }
+
+ macro toplevel() {
+ expression: wrapper1(attribute(right))
+ }
+
+ macro interfering() {
+ expression: wrapper1(attribute(wrong))
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/gemini2/rank-profiles.cfg b/config-model/src/test/derived/gemini2/rank-profiles.cfg
new file mode 100644
index 00000000000..362155fe6cc
--- /dev/null
+++ b/config-model/src/test/derived/gemini2/rank-profiles.cfg
@@ -0,0 +1,29 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "test"
+rankprofile[2].fef.property[0].name "rankingExpression(wrapper2).rankingScript"
+rankprofile[2].fef.property[0].value "x"
+rankprofile[2].fef.property[1].name "rankingExpression(wrapper2@c7ef616469cdb0b3).rankingScript"
+rankprofile[2].fef.property[1].value "x"
+rankprofile[2].fef.property[2].name "rankingExpression(wrapper1).rankingScript"
+rankprofile[2].fef.property[2].value "rankingExpression(wrapper2@c7ef616469cdb0b3)"
+rankprofile[2].fef.property[3].name "rankingExpression(wrapper2@2d437c13405e61d6).rankingScript"
+rankprofile[2].fef.property[3].value "attribute(right)"
+rankprofile[2].fef.property[4].name "rankingExpression(wrapper1@2d437c13405e61d6).rankingScript"
+rankprofile[2].fef.property[4].value "rankingExpression(wrapper2@2d437c13405e61d6)"
+rankprofile[2].fef.property[5].name "rankingExpression(toplevel).rankingScript"
+rankprofile[2].fef.property[5].value "rankingExpression(wrapper1@2d437c13405e61d6)"
+rankprofile[2].fef.property[6].name "rankingExpression(wrapper2@8fc8470e911f253f).rankingScript"
+rankprofile[2].fef.property[6].value "attribute(wrong)"
+rankprofile[2].fef.property[7].name "rankingExpression(wrapper1@8fc8470e911f253f).rankingScript"
+rankprofile[2].fef.property[7].value "rankingExpression(wrapper2@8fc8470e911f253f)"
+rankprofile[2].fef.property[8].name "rankingExpression(interfering).rankingScript"
+rankprofile[2].fef.property[8].value "rankingExpression(wrapper1@8fc8470e911f253f)" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/attributes.cfg b/config-model/src/test/derived/id/attributes.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config-model/src/test/derived/id/attributes.cfg
diff --git a/config-model/src/test/derived/id/documentmanager.cfg b/config-model/src/test/derived/id/documentmanager.cfg
new file mode 100644
index 00000000000..40996d46399
--- /dev/null
+++ b/config-model/src/test/derived/id/documentmanager.cfg
@@ -0,0 +1,40 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -531633022
+datatype[1].structtype[0].name "id.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "uri"
+datatype[1].structtype[0].field[0].datatype 10
+datatype[1].structtype[0].field[1].name "rankfeatures"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "summaryfeatures"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[2].id -1830022377
+datatype[2].structtype[0].name "id.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id 3225629
+datatype[3].documenttype[0].name "id"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -531633022
+datatype[3].documenttype[0].bodystruct -1830022377
+datatype[3].documenttype[0].fieldsets{[document]}.fields[0] "uri"
diff --git a/config-model/src/test/derived/id/id.sd b/config-model/src/test/derived/id/id.sd
new file mode 100644
index 00000000000..aac5463775c
--- /dev/null
+++ b/config-model/src/test/derived/id/id.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search id {
+
+ document id {
+
+ field uri type uri {
+ indexing: summary | index
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/id/ilscripts.cfg b/config-model/src/test/derived/id/ilscripts.cfg
new file mode 100644
index 00000000000..c613431cdf9
--- /dev/null
+++ b/config-model/src/test/derived/id/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "id"
+ilscript[0].docfield[0] "uri"
+ilscript[0].content[0] "clear_state | guard { input uri | summary uri | index uri; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/index-info.cfg b/config-model/src/test/derived/id/index-info.cfg
new file mode 100644
index 00000000000..e54e8640d13
--- /dev/null
+++ b/config-model/src/test/derived/id/index-info.cfg
@@ -0,0 +1,45 @@
+indexinfo[0].name "id"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "uri"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "uri"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "uri"
+indexinfo[0].command[4].command "fullurl"
+indexinfo[0].command[5].indexname "uri.uri"
+indexinfo[0].command[5].command "fullurl"
+indexinfo[0].command[6].indexname "uri.uri"
+indexinfo[0].command[6].command "lowercase"
+indexinfo[0].command[7].indexname "uri.path"
+indexinfo[0].command[7].command "fullurl"
+indexinfo[0].command[8].indexname "uri.path"
+indexinfo[0].command[8].command "lowercase"
+indexinfo[0].command[9].indexname "uri.query"
+indexinfo[0].command[9].command "fullurl"
+indexinfo[0].command[10].indexname "uri.query"
+indexinfo[0].command[10].command "lowercase"
+indexinfo[0].command[11].indexname "uri.hostname"
+indexinfo[0].command[11].command "urlhost"
+indexinfo[0].command[12].indexname "uri.hostname"
+indexinfo[0].command[12].command "lowercase"
+indexinfo[0].command[13].indexname "rankfeatures"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "summaryfeatures"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "uri.fragment"
+indexinfo[0].command[15].command "index"
+indexinfo[0].command[16].indexname "uri.host"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "uri.hostname"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "uri.path"
+indexinfo[0].command[18].command "index"
+indexinfo[0].command[19].indexname "uri.port"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "uri.query"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "uri.scheme"
+indexinfo[0].command[21].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/rank-profiles.cfg b/config-model/src/test/derived/id/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/id/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/summary.cfg b/config-model/src/test/derived/id/summary.cfg
new file mode 100644
index 00000000000..e67b81746b8
--- /dev/null
+++ b/config-model/src/test/derived/id/summary.cfg
@@ -0,0 +1,11 @@
+defaultsummaryid 1814716401
+classes[0].id 1814716401
+classes[0].name "default"
+classes[0].fields[0].name "uri"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "rankfeatures"
+classes[0].fields[1].type "featuredata"
+classes[0].fields[2].name "summaryfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "documentid"
+classes[0].fields[3].type "longstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/summarymap.cfg b/config-model/src/test/derived/id/summarymap.cfg
new file mode 100644
index 00000000000..42b6e811ee6
--- /dev/null
+++ b/config-model/src/test/derived/id/summarymap.cfg
@@ -0,0 +1,7 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/id/vsmsummary.cfg b/config-model/src/test/derived/id/vsmsummary.cfg
new file mode 100644
index 00000000000..3538ba9880e
--- /dev/null
+++ b/config-model/src/test/derived/id/vsmsummary.cfg
@@ -0,0 +1,8 @@
+outputclass ""
+fieldmap[0].summary "uri"
+fieldmap[0].document[0].field "uri"
+fieldmap[0].command NONE
+fieldmap[1].summary "rankfeatures"
+fieldmap[1].command NONE
+fieldmap[2].summary "summaryfeatures"
+fieldmap[2].command NONE \ No newline at end of file
diff --git a/config-model/src/test/derived/indexinfo_fieldsets/index-info.cfg b/config-model/src/test/derived/indexinfo_fieldsets/index-info.cfg
new file mode 100644
index 00000000000..34dbb7d5e5b
--- /dev/null
+++ b/config-model/src/test/derived/indexinfo_fieldsets/index-info.cfg
@@ -0,0 +1,74 @@
+indexinfo[].name "indexinfo_fieldsets"
+indexinfo[].command[].indexname "sddocname"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "sddocname"
+indexinfo[].command[].command "word"
+
+indexinfo[].command[].indexname "nostemming1"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nostemming1"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nostemming1"
+indexinfo[].command[].command "normalize"
+
+indexinfo[].command[].indexname "nostemming2"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nostemming2"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nostemming2"
+indexinfo[].command[].command "normalize"
+
+indexinfo[].command[].indexname "nonormalizing1"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nonormalizing1"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nonormalizing1"
+indexinfo[].command[].command "stem:SHORTEST"
+
+indexinfo[].command[].indexname "nonormalizing2"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nonormalizing2"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nonormalizing2"
+indexinfo[].command[].command "stem:SHORTEST"
+
+indexinfo[].command[].indexname "exact1"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "exact1"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "exact1"
+indexinfo[].command[].command "exact @@"
+
+indexinfo[].command[].indexname "exact2"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "exact2"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "exact2"
+indexinfo[].command[].command "exact @@"
+
+indexinfo[].command[].indexname "rankfeatures"
+indexinfo[].command[].command "index"
+
+indexinfo[].command[].indexname "summaryfeatures"
+indexinfo[].command[].command "index"
+
+indexinfo[].command[].indexname "nostemming"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nostemming"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nostemming"
+indexinfo[].command[].command "normalize"
+
+indexinfo[].command[].indexname "nonormalizing"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "nonormalizing"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "nonormalizing"
+indexinfo[].command[].command "stem:SHORTEST"
+
+indexinfo[].command[].indexname "exact"
+indexinfo[].command[].command "lowercase"
+indexinfo[].command[].indexname "exact"
+indexinfo[].command[].command "index"
+indexinfo[].command[].indexname "exact"
+indexinfo[].command[].command "exact @@"
diff --git a/config-model/src/test/derived/indexinfo_fieldsets/indexinfo_fieldsets.sd b/config-model/src/test/derived/indexinfo_fieldsets/indexinfo_fieldsets.sd
new file mode 100644
index 00000000000..449a5d0a02e
--- /dev/null
+++ b/config-model/src/test/derived/indexinfo_fieldsets/indexinfo_fieldsets.sd
@@ -0,0 +1,50 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search indexinfo_fieldsets {
+
+ document indexinfo_fieldsets {
+
+ field nostemming1 type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field nostemming2 type string {
+ indexing: summary | index
+ stemming: none
+ }
+
+ field nonormalizing1 type string {
+ indexing: summary | index
+ normalizing: none
+ }
+
+ field nonormalizing2 type string {
+ indexing: summary | index
+ normalizing: none
+ }
+
+ field exact1 type string {
+ indexing: summary | index
+ match: exact
+ }
+
+ field exact2 type string {
+ indexing: summary | index
+ match: exact
+ }
+
+ }
+
+ fieldset nostemming {
+ fields: nostemming1, nostemming2
+ }
+
+ fieldset nonormalizing {
+ fields: nonormalizing1, nonormalizing2
+ }
+
+ fieldset exact {
+ fields: exact1, exact2
+ }
+
+}
diff --git a/config-model/src/test/derived/indexinfo_lowercase/index-info.cfg b/config-model/src/test/derived/indexinfo_lowercase/index-info.cfg
new file mode 100644
index 00000000000..027e7533004
--- /dev/null
+++ b/config-model/src/test/derived/indexinfo_lowercase/index-info.cfg
@@ -0,0 +1,249 @@
+indexinfo[0].name "indexinfo_lowercase"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "lc_attribute_src"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "lc_index_src"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "lc_summary_src"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "nc_attribute"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "nc_attribute"
+indexinfo[0].command[6].command "attribute"
+indexinfo[0].command[7].indexname "nc_attribute"
+indexinfo[0].command[7].command "word"
+indexinfo[0].command[8].indexname "nc_index"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "nc_index"
+indexinfo[0].command[9].command "lowercase"
+indexinfo[0].command[10].indexname "nc_index"
+indexinfo[0].command[10].command "stem:SHORTEST"
+indexinfo[0].command[11].indexname "nc_index"
+indexinfo[0].command[11].command "normalize"
+indexinfo[0].command[12].indexname "nc_summary"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "lc_attribute"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "lc_attribute"
+indexinfo[0].command[14].command "lowercase"
+indexinfo[0].command[15].indexname "lc_attribute"
+indexinfo[0].command[15].command "attribute"
+indexinfo[0].command[16].indexname "lc_attribute"
+indexinfo[0].command[16].command "word"
+indexinfo[0].command[17].indexname "lc_index"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "lc_index"
+indexinfo[0].command[18].command "lowercase"
+indexinfo[0].command[19].indexname "lc_index"
+indexinfo[0].command[19].command "stem:SHORTEST"
+indexinfo[0].command[20].indexname "lc_index"
+indexinfo[0].command[20].command "normalize"
+indexinfo[0].command[21].indexname "lc_summary"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "lc_summary"
+indexinfo[0].command[22].command "lowercase"
+indexinfo[0].command[23].indexname "rankfeatures"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "summaryfeatures"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "lc_set1"
+indexinfo[0].command[25].command "lowercase"
+indexinfo[0].command[26].indexname "lc_set1"
+indexinfo[0].command[26].command "attribute"
+indexinfo[0].command[27].indexname "lc_set1"
+indexinfo[0].command[27].command "index"
+indexinfo[0].command[28].indexname "lc_set1"
+indexinfo[0].command[28].command "word"
+indexinfo[0].command[29].indexname "lc_set2"
+indexinfo[0].command[29].command "lowercase"
+indexinfo[0].command[30].indexname "lc_set2"
+indexinfo[0].command[30].command "index"
+indexinfo[0].command[31].indexname "lc_set2"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "lc_set2"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[33].indexname "lc_set3"
+indexinfo[0].command[33].command "lowercase"
+indexinfo[0].command[34].indexname "lc_set3"
+indexinfo[0].command[34].command "attribute"
+indexinfo[0].command[35].indexname "lc_set3"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "lc_set4"
+indexinfo[0].command[36].command "lowercase"
+indexinfo[0].command[37].indexname "lc_set4"
+indexinfo[0].command[37].command "index"
+indexinfo[0].command[38].indexname "lc_set4"
+indexinfo[0].command[38].command "stem:SHORTEST"
+indexinfo[0].command[39].indexname "lc_set4"
+indexinfo[0].command[39].command "normalize"
+indexinfo[0].command[40].indexname "lc_set5"
+indexinfo[0].command[40].command "lowercase"
+indexinfo[0].command[41].indexname "lc_set5"
+indexinfo[0].command[41].command "attribute"
+indexinfo[0].command[42].indexname "lc_set5"
+indexinfo[0].command[42].command "index"
+indexinfo[0].command[43].indexname "lc_set5"
+indexinfo[0].command[43].command "word"
+indexinfo[0].command[44].indexname "lc_set6"
+indexinfo[0].command[44].command "lowercase"
+indexinfo[0].command[45].indexname "lc_set6"
+indexinfo[0].command[45].command "index"
+indexinfo[0].command[46].indexname "lc_set6"
+indexinfo[0].command[46].command "stem:SHORTEST"
+indexinfo[0].command[47].indexname "lc_set6"
+indexinfo[0].command[47].command "normalize"
+indexinfo[0].command[48].indexname "lc_set7"
+indexinfo[0].command[48].command "lowercase"
+indexinfo[0].command[49].indexname "lc_set7"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "lc_set7"
+indexinfo[0].command[50].command "stem:SHORTEST"
+indexinfo[0].command[51].indexname "lc_set7"
+indexinfo[0].command[51].command "normalize"
+indexinfo[0].command[52].indexname "nc_set1"
+indexinfo[0].command[52].command "attribute"
+indexinfo[0].command[53].indexname "nc_set1"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "nc_set1"
+indexinfo[0].command[54].command "word"
+indexinfo[0].command[55].indexname "nc_set2"
+indexinfo[0].command[55].command "lowercase"
+indexinfo[0].command[56].indexname "nc_set2"
+indexinfo[0].command[56].command "index"
+indexinfo[0].command[57].indexname "nc_set2"
+indexinfo[0].command[57].command "stem:SHORTEST"
+indexinfo[0].command[58].indexname "nc_set2"
+indexinfo[0].command[58].command "normalize"
+indexinfo[0].command[59].indexname "nc_set3"
+indexinfo[0].command[59].command "attribute"
+indexinfo[0].command[60].indexname "nc_set3"
+indexinfo[0].command[60].command "index"
+indexinfo[0].command[61].indexname "nc_set4"
+indexinfo[0].command[61].command "lowercase"
+indexinfo[0].command[62].indexname "nc_set4"
+indexinfo[0].command[62].command "index"
+indexinfo[0].command[63].indexname "nc_set4"
+indexinfo[0].command[63].command "stem:SHORTEST"
+indexinfo[0].command[64].indexname "nc_set4"
+indexinfo[0].command[64].command "normalize"
+indexinfo[0].command[65].indexname "nc_set5"
+indexinfo[0].command[65].command "attribute"
+indexinfo[0].command[66].indexname "nc_set5"
+indexinfo[0].command[66].command "index"
+indexinfo[0].command[67].indexname "nc_set5"
+indexinfo[0].command[67].command "word"
+indexinfo[0].command[68].indexname "nc_set6"
+indexinfo[0].command[68].command "lowercase"
+indexinfo[0].command[69].indexname "nc_set6"
+indexinfo[0].command[69].command "index"
+indexinfo[0].command[70].indexname "nc_set6"
+indexinfo[0].command[70].command "stem:SHORTEST"
+indexinfo[0].command[71].indexname "nc_set6"
+indexinfo[0].command[71].command "normalize"
+indexinfo[0].command[72].indexname "nc_set7"
+indexinfo[0].command[72].command "lowercase"
+indexinfo[0].command[73].indexname "nc_set7"
+indexinfo[0].command[73].command "index"
+indexinfo[0].command[74].indexname "nc_set7"
+indexinfo[0].command[74].command "stem:SHORTEST"
+indexinfo[0].command[75].indexname "nc_set7"
+indexinfo[0].command[75].command "normalize"
+indexinfo[0].command[76].indexname "nc_set8"
+indexinfo[0].command[76].command "lowercase"
+indexinfo[0].command[77].indexname "nc_set8"
+indexinfo[0].command[77].command "index"
+indexinfo[0].command[78].indexname "nc_set8"
+indexinfo[0].command[78].command "stem:SHORTEST"
+indexinfo[0].command[79].indexname "nc_set8"
+indexinfo[0].command[79].command "normalize"
+indexinfo[0].command[80].indexname "nc_set9"
+indexinfo[0].command[80].command "lowercase"
+indexinfo[0].command[81].indexname "nc_set9"
+indexinfo[0].command[81].command "index"
+indexinfo[0].command[82].indexname "nc_set9"
+indexinfo[0].command[82].command "stem:SHORTEST"
+indexinfo[0].command[83].indexname "nc_set9"
+indexinfo[0].command[83].command "normalize"
+indexinfo[0].command[84].indexname "nc_set10"
+indexinfo[0].command[84].command "lowercase"
+indexinfo[0].command[85].indexname "nc_set10"
+indexinfo[0].command[85].command "attribute"
+indexinfo[0].command[86].indexname "nc_set10"
+indexinfo[0].command[86].command "index"
+indexinfo[0].command[87].indexname "nc_set10"
+indexinfo[0].command[87].command "word"
+indexinfo[0].command[88].indexname "nc_set11"
+indexinfo[0].command[88].command "lowercase"
+indexinfo[0].command[89].indexname "nc_set11"
+indexinfo[0].command[89].command "attribute"
+indexinfo[0].command[90].indexname "nc_set11"
+indexinfo[0].command[90].command "index"
+indexinfo[0].command[91].indexname "nc_set11"
+indexinfo[0].command[91].command "word"
+indexinfo[0].command[92].indexname "nc_set12"
+indexinfo[0].command[92].command "lowercase"
+indexinfo[0].command[93].indexname "nc_set12"
+indexinfo[0].command[93].command "index"
+indexinfo[0].command[94].indexname "nc_set12"
+indexinfo[0].command[94].command "stem:SHORTEST"
+indexinfo[0].command[95].indexname "nc_set12"
+indexinfo[0].command[95].command "normalize"
+indexinfo[0].command[96].indexname "nc_set13"
+indexinfo[0].command[96].command "lowercase"
+indexinfo[0].command[97].indexname "nc_set13"
+indexinfo[0].command[97].command "index"
+indexinfo[0].command[98].indexname "nc_set13"
+indexinfo[0].command[98].command "stem:SHORTEST"
+indexinfo[0].command[99].indexname "nc_set13"
+indexinfo[0].command[99].command "normalize"
+indexinfo[0].command[100].indexname "nc_set14"
+indexinfo[0].command[100].command "lowercase"
+indexinfo[0].command[101].indexname "nc_set14"
+indexinfo[0].command[101].command "index"
+indexinfo[0].command[102].indexname "nc_set14"
+indexinfo[0].command[102].command "stem:SHORTEST"
+indexinfo[0].command[103].indexname "nc_set14"
+indexinfo[0].command[103].command "normalize"
+indexinfo[0].command[104].indexname "nc_set15"
+indexinfo[0].command[104].command "lowercase"
+indexinfo[0].command[105].indexname "nc_set15"
+indexinfo[0].command[105].command "index"
+indexinfo[0].command[106].indexname "nc_set15"
+indexinfo[0].command[106].command "stem:SHORTEST"
+indexinfo[0].command[107].indexname "nc_set15"
+indexinfo[0].command[107].command "normalize"
+indexinfo[0].command[108].indexname "nc_set16"
+indexinfo[0].command[108].command "lowercase"
+indexinfo[0].command[109].indexname "nc_set16"
+indexinfo[0].command[109].command "index"
+indexinfo[0].command[110].indexname "nc_set16"
+indexinfo[0].command[110].command "stem:SHORTEST"
+indexinfo[0].command[111].indexname "nc_set16"
+indexinfo[0].command[111].command "normalize"
+indexinfo[0].command[112].indexname "nc_set17"
+indexinfo[0].command[112].command "lowercase"
+indexinfo[0].command[113].indexname "nc_set17"
+indexinfo[0].command[113].command "index"
+indexinfo[0].command[114].indexname "nc_set17"
+indexinfo[0].command[114].command "stem:SHORTEST"
+indexinfo[0].command[115].indexname "nc_set17"
+indexinfo[0].command[115].command "normalize"
+indexinfo[0].command[116].indexname "nc_set18"
+indexinfo[0].command[116].command "lowercase"
+indexinfo[0].command[117].indexname "nc_set18"
+indexinfo[0].command[117].command "index"
+indexinfo[0].command[118].indexname "nc_set18"
+indexinfo[0].command[118].command "stem:SHORTEST"
+indexinfo[0].command[119].indexname "nc_set18"
+indexinfo[0].command[119].command "normalize"
+indexinfo[0].command[120].indexname "nc_set19"
+indexinfo[0].command[120].command "lowercase"
+indexinfo[0].command[121].indexname "nc_set19"
+indexinfo[0].command[121].command "index"
+indexinfo[0].command[122].indexname "nc_set19"
+indexinfo[0].command[122].command "stem:SHORTEST"
+indexinfo[0].command[123].indexname "nc_set19"
+indexinfo[0].command[123].command "normalize" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexinfo_lowercase/indexinfo_lowercase.sd b/config-model/src/test/derived/indexinfo_lowercase/indexinfo_lowercase.sd
new file mode 100644
index 00000000000..951a36d0817
--- /dev/null
+++ b/config-model/src/test/derived/indexinfo_lowercase/indexinfo_lowercase.sd
@@ -0,0 +1,120 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search indexinfo_lowercase {
+
+ document indexinfo_lowercase {
+ field lc_attribute_src type string {
+
+ }
+ field lc_index_src type string {
+
+ }
+ field lc_summary_src type string {
+
+ }
+
+ # these fields do not lower case any input, and should not lower case query
+ field nc_attribute type string {
+ indexing: attribute
+ }
+ field nc_index type string {
+ indexing: index
+ }
+ field nc_summary type string {
+ indexing: summary
+ }
+ }
+
+ # these fields lower case all input, and should lower case query
+ field lc_attribute type string {
+ indexing: input lc_attribute_src | lowercase | attribute
+ }
+ field lc_index type string {
+ indexing: input lc_index_src | lowercase | index
+ }
+ field lc_summary type string {
+ indexing: input lc_summary_src | lowercase | summary
+ }
+
+ # these field sets contain only lower cased fields, and should lower case query
+ fieldset lc_set1 {
+ fields: lc_attribute
+ }
+ fieldset lc_set2 {
+ fields: lc_index
+ }
+ fieldset lc_set3 {
+ fields: lc_summary
+ }
+ fieldset lc_set4 {
+ fields: lc_attribute, lc_index
+ }
+ fieldset lc_set5 {
+ fields: lc_attribute, lc_summary
+ }
+ fieldset lc_set6 {
+ fields: lc_index, lc_summary
+ }
+ fieldset lc_set7 {
+ fields: lc_attribute, lc_index, lc_summary
+ }
+
+ # these field sets contain at least one non-lower cased field, and should not lower case query
+ fieldset nc_set1 {
+ fields: nc_attribute
+ }
+ fieldset nc_set2 {
+ fields: nc_index
+ }
+ fieldset nc_set3 {
+ fields: nc_summary
+ }
+ fieldset nc_set4 {
+ fields: nc_attribute, nc_index
+ }
+ fieldset nc_set5 {
+ fields: nc_attribute, nc_summary
+ }
+ fieldset nc_set6 {
+ fields: nc_index, nc_summary
+ }
+ fieldset nc_set7 {
+ fields: nc_attribute, nc_index, nc_summary
+ }
+ fieldset nc_set8 {
+ fields: lc_attribute, nc_index
+ }
+ fieldset nc_set9 {
+ fields: nc_attribute, lc_index
+ }
+ fieldset nc_set10 {
+ fields: lc_attribute, nc_summary
+ }
+ fieldset nc_set11 {
+ fields: nc_attribute, lc_summary
+ }
+ fieldset nc_set12 {
+ fields: lc_index, nc_summary
+ }
+ fieldset nc_set13 {
+ fields: nc_index, lc_summary
+ }
+ fieldset nc_set14 {
+ fields: lc_attribute, nc_index, nc_summary
+ }
+ fieldset nc_set15 {
+ fields: lc_attribute, lc_index, nc_summary
+ }
+ fieldset nc_set16 {
+ fields: lc_attribute, nc_index, lc_summary
+ }
+ fieldset nc_set17 {
+ fields: nc_attribute, lc_index, nc_summary
+ }
+ fieldset nc_set18 {
+ fields: nc_attribute, lc_index, lc_summary
+ }
+ fieldset nc_set19 {
+ fields: nc_attribute, nc_index, lc_summary
+ }
+
+}
diff --git a/config-model/src/test/derived/indexschema/index-info.cfg b/config-model/src/test/derived/indexschema/index-info.cfg
new file mode 100644
index 00000000000..ca5818b9b88
--- /dev/null
+++ b/config-model/src/test/derived/indexschema/index-info.cfg
@@ -0,0 +1,311 @@
+indexinfo[0].name "indexschema"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "sa"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "sa"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "sa"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "sa"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "sb"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "sb"
+indexinfo[0].command[7].command "lowercase"
+indexinfo[0].command[8].indexname "sb"
+indexinfo[0].command[8].command "stem:SHORTEST"
+indexinfo[0].command[9].indexname "sb"
+indexinfo[0].command[9].command "normalize"
+indexinfo[0].command[10].indexname "sc"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "sc"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "sc"
+indexinfo[0].command[12].command "stem:SHORTEST"
+indexinfo[0].command[13].indexname "sc"
+indexinfo[0].command[13].command "normalize"
+indexinfo[0].command[14].indexname "sd"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "sd"
+indexinfo[0].command[15].command "lowercase"
+indexinfo[0].command[16].indexname "sd"
+indexinfo[0].command[16].command "stem:SHORTEST"
+indexinfo[0].command[17].indexname "sd"
+indexinfo[0].command[17].command "normalize"
+indexinfo[0].command[18].indexname "sd"
+indexinfo[0].command[18].command "literal-boost"
+indexinfo[0].command[19].indexname "pos.x"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "pos.x"
+indexinfo[0].command[20].command "numerical"
+indexinfo[0].command[21].indexname "pos.y"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "pos.y"
+indexinfo[0].command[22].command "numerical"
+indexinfo[0].command[23].indexname "pos"
+indexinfo[0].command[23].command "default-position"
+indexinfo[0].command[24].indexname "pos"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "se"
+indexinfo[0].command[25].command "index"
+indexinfo[0].command[26].indexname "se"
+indexinfo[0].command[26].command "attribute"
+indexinfo[0].command[27].indexname "se"
+indexinfo[0].command[27].command "word"
+indexinfo[0].command[28].indexname "sf"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "sf"
+indexinfo[0].command[29].command "lowercase"
+indexinfo[0].command[30].indexname "sf"
+indexinfo[0].command[30].command "multivalue"
+indexinfo[0].command[31].indexname "sf"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "sf"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[33].indexname "sg"
+indexinfo[0].command[33].command "index"
+indexinfo[0].command[34].indexname "sg"
+indexinfo[0].command[34].command "lowercase"
+indexinfo[0].command[35].indexname "sg"
+indexinfo[0].command[35].command "multivalue"
+indexinfo[0].command[36].indexname "sg"
+indexinfo[0].command[36].command "stem:SHORTEST"
+indexinfo[0].command[37].indexname "sg"
+indexinfo[0].command[37].command "normalize"
+indexinfo[0].command[38].indexname "sh"
+indexinfo[0].command[38].command "index"
+indexinfo[0].command[39].indexname "sh"
+indexinfo[0].command[39].command "lowercase"
+indexinfo[0].command[40].indexname "sh"
+indexinfo[0].command[40].command "fullurl"
+indexinfo[0].command[41].indexname "sh.sh"
+indexinfo[0].command[41].command "fullurl"
+indexinfo[0].command[42].indexname "sh.sh"
+indexinfo[0].command[42].command "lowercase"
+indexinfo[0].command[43].indexname "sh.path"
+indexinfo[0].command[43].command "fullurl"
+indexinfo[0].command[44].indexname "sh.path"
+indexinfo[0].command[44].command "lowercase"
+indexinfo[0].command[45].indexname "sh.query"
+indexinfo[0].command[45].command "fullurl"
+indexinfo[0].command[46].indexname "sh.query"
+indexinfo[0].command[46].command "lowercase"
+indexinfo[0].command[47].indexname "sh.hostname"
+indexinfo[0].command[47].command "urlhost"
+indexinfo[0].command[48].indexname "sh.hostname"
+indexinfo[0].command[48].command "lowercase"
+indexinfo[0].command[49].indexname "si"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "si"
+indexinfo[0].command[50].command "lowercase"
+indexinfo[0].command[51].indexname "si"
+indexinfo[0].command[51].command "stem:SHORTEST"
+indexinfo[0].command[52].indexname "si"
+indexinfo[0].command[52].command "normalize"
+indexinfo[0].command[53].indexname "exact1"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "exact1"
+indexinfo[0].command[54].command "lowercase"
+indexinfo[0].command[55].indexname "exact1"
+indexinfo[0].command[55].command "exact @@"
+indexinfo[0].command[56].indexname "exact2"
+indexinfo[0].command[56].command "index"
+indexinfo[0].command[57].indexname "exact2"
+indexinfo[0].command[57].command "lowercase"
+indexinfo[0].command[58].indexname "exact2"
+indexinfo[0].command[58].command "exact @@"
+indexinfo[0].command[59].indexname "ia"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "ia"
+indexinfo[0].command[60].command "attribute"
+indexinfo[0].command[61].indexname "ia"
+indexinfo[0].command[61].command "numerical"
+indexinfo[0].command[62].indexname "ib"
+indexinfo[0].command[62].command "index"
+indexinfo[0].command[63].indexname "ib"
+indexinfo[0].command[63].command "attribute"
+indexinfo[0].command[64].indexname "ib"
+indexinfo[0].command[64].command "numerical"
+indexinfo[0].command[65].indexname "ic"
+indexinfo[0].command[65].command "index"
+indexinfo[0].command[66].indexname "ic"
+indexinfo[0].command[66].command "attribute"
+indexinfo[0].command[67].indexname "ic"
+indexinfo[0].command[67].command "numerical"
+indexinfo[0].command[68].indexname "nostemstring1"
+indexinfo[0].command[68].command "index"
+indexinfo[0].command[69].indexname "nostemstring1"
+indexinfo[0].command[69].command "lowercase"
+indexinfo[0].command[70].indexname "nostemstring1"
+indexinfo[0].command[70].command "normalize"
+indexinfo[0].command[71].indexname "nostemstring2"
+indexinfo[0].command[71].command "index"
+indexinfo[0].command[72].indexname "nostemstring2"
+indexinfo[0].command[72].command "lowercase"
+indexinfo[0].command[73].indexname "nostemstring2"
+indexinfo[0].command[73].command "normalize"
+indexinfo[0].command[74].indexname "nostemstring3"
+indexinfo[0].command[74].command "index"
+indexinfo[0].command[75].indexname "nostemstring3"
+indexinfo[0].command[75].command "lowercase"
+indexinfo[0].command[76].indexname "nostemstring3"
+indexinfo[0].command[76].command "normalize"
+indexinfo[0].command[77].indexname "nostemstring4"
+indexinfo[0].command[77].command "index"
+indexinfo[0].command[78].indexname "nostemstring4"
+indexinfo[0].command[78].command "lowercase"
+indexinfo[0].command[79].indexname "nostemstring4"
+indexinfo[0].command[79].command "normalize"
+indexinfo[0].command[80].indexname "fs9"
+indexinfo[0].command[80].command "index"
+indexinfo[0].command[81].indexname "fs9"
+indexinfo[0].command[81].command "lowercase"
+indexinfo[0].command[82].indexname "fs9"
+indexinfo[0].command[82].command "stem:SHORTEST"
+indexinfo[0].command[83].indexname "fs9"
+indexinfo[0].command[83].command "normalize"
+indexinfo[0].command[84].indexname "f10.text"
+indexinfo[0].command[84].command "index"
+indexinfo[0].command[85].indexname "f10.text"
+indexinfo[0].command[85].command "lowercase"
+indexinfo[0].command[86].indexname "f10.text"
+indexinfo[0].command[86].command "stem:SHORTEST"
+indexinfo[0].command[87].indexname "f10.text"
+indexinfo[0].command[87].command "normalize"
+indexinfo[0].command[88].indexname "f10.name"
+indexinfo[0].command[88].command "index"
+indexinfo[0].command[89].indexname "f10"
+indexinfo[0].command[89].command "index"
+indexinfo[0].command[90].indexname "f10"
+indexinfo[0].command[90].command "multivalue"
+indexinfo[0].command[91].indexname "pos.distance"
+indexinfo[0].command[91].command "index"
+indexinfo[0].command[92].indexname "pos.distance"
+indexinfo[0].command[92].command "numerical"
+indexinfo[0].command[93].indexname "pos.position"
+indexinfo[0].command[93].command "index"
+indexinfo[0].command[94].indexname "pos.position"
+indexinfo[0].command[94].command "multivalue"
+indexinfo[0].command[95].indexname "pos_zcurve"
+indexinfo[0].command[95].command "index"
+indexinfo[0].command[96].indexname "pos_zcurve"
+indexinfo[0].command[96].command "attribute"
+indexinfo[0].command[97].indexname "pos_zcurve"
+indexinfo[0].command[97].command "fast-search"
+indexinfo[0].command[98].indexname "pos_zcurve"
+indexinfo[0].command[98].command "numerical"
+indexinfo[0].command[99].indexname "rankfeatures"
+indexinfo[0].command[99].command "index"
+indexinfo[0].command[100].indexname "sd_literal"
+indexinfo[0].command[100].command "index"
+indexinfo[0].command[101].indexname "sd_literal"
+indexinfo[0].command[101].command "lowercase"
+indexinfo[0].command[102].indexname "searchfield1"
+indexinfo[0].command[102].command "index"
+indexinfo[0].command[103].indexname "searchfield2"
+indexinfo[0].command[103].command "index"
+indexinfo[0].command[104].indexname "searchfield2"
+indexinfo[0].command[104].command "numerical"
+indexinfo[0].command[105].indexname "sh.fragment"
+indexinfo[0].command[105].command "index"
+indexinfo[0].command[106].indexname "sh.host"
+indexinfo[0].command[106].command "index"
+indexinfo[0].command[107].indexname "sh.hostname"
+indexinfo[0].command[107].command "index"
+indexinfo[0].command[108].indexname "sh.path"
+indexinfo[0].command[108].command "index"
+indexinfo[0].command[109].indexname "sh.port"
+indexinfo[0].command[109].command "index"
+indexinfo[0].command[110].indexname "sh.query"
+indexinfo[0].command[110].command "index"
+indexinfo[0].command[111].indexname "sh.scheme"
+indexinfo[0].command[111].command "index"
+indexinfo[0].command[112].indexname "summaryfeatures"
+indexinfo[0].command[112].command "index"
+indexinfo[0].command[113].indexname "sa"
+indexinfo[0].command[113].command "dynteaser"
+indexinfo[0].command[114].indexname "fs1"
+indexinfo[0].command[114].command "lowercase"
+indexinfo[0].command[115].indexname "fs1"
+indexinfo[0].command[115].command "multivalue"
+indexinfo[0].command[116].indexname "fs1"
+indexinfo[0].command[116].command "index"
+indexinfo[0].command[117].indexname "fs1"
+indexinfo[0].command[117].command "stem:SHORTEST"
+indexinfo[0].command[118].indexname "fs1"
+indexinfo[0].command[118].command "normalize"
+indexinfo[0].command[119].indexname "fs2"
+indexinfo[0].command[119].command "lowercase"
+indexinfo[0].command[120].indexname "fs2"
+indexinfo[0].command[120].command "index"
+indexinfo[0].command[121].indexname "fs2"
+indexinfo[0].command[121].command "stem:SHORTEST"
+indexinfo[0].command[122].indexname "fs2"
+indexinfo[0].command[122].command "normalize"
+indexinfo[0].command[123].indexname "fs3"
+indexinfo[0].command[123].command "attribute"
+indexinfo[0].command[124].indexname "fs3"
+indexinfo[0].command[124].command "index"
+indexinfo[0].command[125].indexname "fs4"
+indexinfo[0].command[125].command "lowercase"
+indexinfo[0].command[126].indexname "fs4"
+indexinfo[0].command[126].command "index"
+indexinfo[0].command[127].indexname "fs4"
+indexinfo[0].command[127].command "stem:SHORTEST"
+indexinfo[0].command[128].indexname "fs4"
+indexinfo[0].command[128].command "normalize"
+indexinfo[0].command[129].indexname "onlyattrib"
+indexinfo[0].command[129].command "attribute"
+indexinfo[0].command[130].indexname "onlyattrib"
+indexinfo[0].command[130].command "index"
+indexinfo[0].command[131].indexname "onlyattrib"
+indexinfo[0].command[131].command "word"
+indexinfo[0].command[132].indexname "exactfields"
+indexinfo[0].command[132].command "lowercase"
+indexinfo[0].command[133].indexname "exactfields"
+indexinfo[0].command[133].command "index"
+indexinfo[0].command[134].indexname "exactfields"
+indexinfo[0].command[134].command "exact @@"
+indexinfo[0].command[135].indexname "exactexplicit"
+indexinfo[0].command[135].command "exact ARNOLD"
+indexinfo[0].command[136].indexname "exactexplicit"
+indexinfo[0].command[136].command "dynteaser"
+indexinfo[0].command[137].indexname "exactexplicit2"
+indexinfo[0].command[137].command "lowercase"
+indexinfo[0].command[138].indexname "exactexplicit2"
+indexinfo[0].command[138].command "index"
+indexinfo[0].command[139].indexname "exactexplicit2"
+indexinfo[0].command[139].command "exact Arnold"
+indexinfo[0].command[140].indexname "gram"
+indexinfo[0].command[140].command "lowercase"
+indexinfo[0].command[141].indexname "gram"
+indexinfo[0].command[141].command "index"
+indexinfo[0].command[142].indexname "gram"
+indexinfo[0].command[142].command "stem:SHORTEST"
+indexinfo[0].command[143].indexname "gram"
+indexinfo[0].command[143].command "normalize"
+indexinfo[0].command[144].indexname "gram"
+indexinfo[0].command[144].command "ngram 2"
+indexinfo[0].command[145].indexname "nostem1"
+indexinfo[0].command[145].command "lowercase"
+indexinfo[0].command[146].indexname "nostem1"
+indexinfo[0].command[146].command "index"
+indexinfo[0].command[147].indexname "nostem1"
+indexinfo[0].command[147].command "normalize"
+indexinfo[0].command[148].indexname "nostem2"
+indexinfo[0].command[148].command "lowercase"
+indexinfo[0].command[149].indexname "nostem2"
+indexinfo[0].command[149].command "index"
+indexinfo[0].command[150].indexname "nostem2"
+indexinfo[0].command[150].command "normalize"
+indexinfo[0].command[151].indexname "default"
+indexinfo[0].command[151].command "lowercase"
+indexinfo[0].command[152].indexname "default"
+indexinfo[0].command[152].command "index"
+indexinfo[0].command[153].indexname "default"
+indexinfo[0].command[153].command "stem:SHORTEST"
+indexinfo[0].command[154].indexname "default"
+indexinfo[0].command[154].command "normalize" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexschema/indexschema.cfg b/config-model/src/test/derived/indexschema/indexschema.cfg
new file mode 100644
index 00000000000..459d2ff37b4
--- /dev/null
+++ b/config-model/src/test/derived/indexschema/indexschema.cfg
@@ -0,0 +1,221 @@
+indexfield[0].name "sa"
+indexfield[0].indextype VESPA
+indexfield[0].datatype STRING
+indexfield[0].collectiontype SINGLE
+indexfield[0].prefix false
+indexfield[0].phrases false
+indexfield[0].positions true
+indexfield[0].averageelementlen 512
+indexfield[1].name "sb"
+indexfield[1].indextype VESPA
+indexfield[1].datatype STRING
+indexfield[1].collectiontype SINGLE
+indexfield[1].prefix false
+indexfield[1].phrases false
+indexfield[1].positions true
+indexfield[1].averageelementlen 512
+indexfield[2].name "sc"
+indexfield[2].indextype VESPA
+indexfield[2].datatype STRING
+indexfield[2].collectiontype SINGLE
+indexfield[2].prefix false
+indexfield[2].phrases false
+indexfield[2].positions true
+indexfield[2].averageelementlen 512
+indexfield[3].name "sd"
+indexfield[3].indextype VESPA
+indexfield[3].datatype STRING
+indexfield[3].collectiontype SINGLE
+indexfield[3].prefix false
+indexfield[3].phrases false
+indexfield[3].positions true
+indexfield[3].averageelementlen 512
+indexfield[4].name "sf"
+indexfield[4].indextype VESPA
+indexfield[4].datatype STRING
+indexfield[4].collectiontype ARRAY
+indexfield[4].prefix false
+indexfield[4].phrases false
+indexfield[4].positions true
+indexfield[4].averageelementlen 512
+indexfield[5].name "sg"
+indexfield[5].indextype VESPA
+indexfield[5].datatype STRING
+indexfield[5].collectiontype WEIGHTEDSET
+indexfield[5].prefix false
+indexfield[5].phrases false
+indexfield[5].positions true
+indexfield[5].averageelementlen 512
+indexfield[6].name "sh"
+indexfield[6].indextype VESPA
+indexfield[6].datatype STRING
+indexfield[6].collectiontype SINGLE
+indexfield[6].prefix false
+indexfield[6].phrases false
+indexfield[6].positions true
+indexfield[6].averageelementlen 512
+indexfield[7].name "si"
+indexfield[7].indextype VESPA
+indexfield[7].datatype STRING
+indexfield[7].collectiontype SINGLE
+indexfield[7].prefix true
+indexfield[7].phrases false
+indexfield[7].positions true
+indexfield[7].averageelementlen 512
+indexfield[8].name "exact1"
+indexfield[8].indextype VESPA
+indexfield[8].datatype STRING
+indexfield[8].collectiontype SINGLE
+indexfield[8].prefix false
+indexfield[8].phrases false
+indexfield[8].positions true
+indexfield[8].averageelementlen 512
+indexfield[9].name "exact2"
+indexfield[9].indextype VESPA
+indexfield[9].datatype STRING
+indexfield[9].collectiontype SINGLE
+indexfield[9].prefix false
+indexfield[9].phrases false
+indexfield[9].positions true
+indexfield[9].averageelementlen 512
+indexfield[10].name "nostemstring1"
+indexfield[10].indextype VESPA
+indexfield[10].datatype STRING
+indexfield[10].collectiontype SINGLE
+indexfield[10].prefix false
+indexfield[10].phrases false
+indexfield[10].positions true
+indexfield[10].averageelementlen 512
+indexfield[11].name "nostemstring2"
+indexfield[11].indextype VESPA
+indexfield[11].datatype STRING
+indexfield[11].collectiontype SINGLE
+indexfield[11].prefix false
+indexfield[11].phrases false
+indexfield[11].positions true
+indexfield[11].averageelementlen 512
+indexfield[12].name "nostemstring3"
+indexfield[12].indextype VESPA
+indexfield[12].datatype STRING
+indexfield[12].collectiontype SINGLE
+indexfield[12].prefix false
+indexfield[12].phrases false
+indexfield[12].positions true
+indexfield[12].averageelementlen 512
+indexfield[13].name "nostemstring4"
+indexfield[13].indextype VESPA
+indexfield[13].datatype STRING
+indexfield[13].collectiontype SINGLE
+indexfield[13].prefix false
+indexfield[13].phrases false
+indexfield[13].positions true
+indexfield[13].averageelementlen 512
+indexfield[14].name "fs9"
+indexfield[14].indextype VESPA
+indexfield[14].datatype STRING
+indexfield[14].collectiontype SINGLE
+indexfield[14].prefix false
+indexfield[14].phrases false
+indexfield[14].positions true
+indexfield[14].averageelementlen 512
+indexfield[15].name "sd_literal"
+indexfield[15].indextype VESPA
+indexfield[15].datatype STRING
+indexfield[15].collectiontype SINGLE
+indexfield[15].prefix false
+indexfield[15].phrases false
+indexfield[15].positions true
+indexfield[15].averageelementlen 512
+indexfield[16].name "sh.fragment"
+indexfield[16].indextype VESPA
+indexfield[16].datatype STRING
+indexfield[16].collectiontype SINGLE
+indexfield[16].prefix false
+indexfield[16].phrases false
+indexfield[16].positions true
+indexfield[16].averageelementlen 512
+indexfield[17].name "sh.host"
+indexfield[17].indextype VESPA
+indexfield[17].datatype STRING
+indexfield[17].collectiontype SINGLE
+indexfield[17].prefix false
+indexfield[17].phrases false
+indexfield[17].positions true
+indexfield[17].averageelementlen 512
+indexfield[18].name "sh.hostname"
+indexfield[18].indextype VESPA
+indexfield[18].datatype STRING
+indexfield[18].collectiontype SINGLE
+indexfield[18].prefix false
+indexfield[18].phrases false
+indexfield[18].positions true
+indexfield[18].averageelementlen 512
+indexfield[19].name "sh.path"
+indexfield[19].indextype VESPA
+indexfield[19].datatype STRING
+indexfield[19].collectiontype SINGLE
+indexfield[19].prefix false
+indexfield[19].phrases false
+indexfield[19].positions true
+indexfield[19].averageelementlen 512
+indexfield[20].name "sh.port"
+indexfield[20].indextype VESPA
+indexfield[20].datatype STRING
+indexfield[20].collectiontype SINGLE
+indexfield[20].prefix false
+indexfield[20].phrases false
+indexfield[20].positions true
+indexfield[20].averageelementlen 512
+indexfield[21].name "sh.query"
+indexfield[21].indextype VESPA
+indexfield[21].datatype STRING
+indexfield[21].collectiontype SINGLE
+indexfield[21].prefix false
+indexfield[21].phrases false
+indexfield[21].positions true
+indexfield[21].averageelementlen 512
+indexfield[22].name "sh.scheme"
+indexfield[22].indextype VESPA
+indexfield[22].datatype STRING
+indexfield[22].collectiontype SINGLE
+indexfield[22].prefix false
+indexfield[22].phrases false
+indexfield[22].positions true
+indexfield[22].averageelementlen 512
+fieldset[0].name "fs9"
+fieldset[0].field[0].name "se"
+fieldset[1].name "fs1"
+fieldset[1].field[0].name "se"
+fieldset[1].field[1].name "sf"
+fieldset[1].field[2].name "sg"
+fieldset[2].name "fs2"
+fieldset[2].field[0].name "si"
+fieldset[3].name "fs3"
+fieldset[3].field[0].name "ib"
+fieldset[3].field[1].name "ic"
+fieldset[4].name "fs4"
+fieldset[4].field[0].name "sa"
+fieldset[4].field[1].name "sb"
+fieldset[5].name "onlyattrib"
+fieldset[5].field[0].name "se"
+fieldset[6].name "exactfields"
+fieldset[6].field[0].name "exact1"
+fieldset[6].field[1].name "exact2"
+fieldset[7].name "exactexplicit"
+fieldset[7].field[0].name "sa"
+fieldset[7].field[1].name "sb"
+fieldset[8].name "exactexplicit2"
+fieldset[8].field[0].name "sc"
+fieldset[8].field[1].name "sd"
+fieldset[9].name "gram"
+fieldset[9].field[0].name "sc"
+fieldset[9].field[1].name "sd"
+fieldset[10].name "nostem1"
+fieldset[10].field[0].name "nostemstring1"
+fieldset[10].field[1].name "nostemstring2"
+fieldset[11].name "nostem2"
+fieldset[11].field[0].name "nostemstring3"
+fieldset[11].field[1].name "nostemstring4"
+fieldset[12].name "default"
+fieldset[12].field[0].name "sb"
+fieldset[12].field[1].name "sc" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexschema/indexschema.sd b/config-model/src/test/derived/indexschema/indexschema.sd
new file mode 100644
index 00000000000..60c732c7c94
--- /dev/null
+++ b/config-model/src/test/derived/indexschema/indexschema.sd
@@ -0,0 +1,161 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search indexschema {
+
+ field searchfield1 type string {}
+ field searchfield2 type int {}
+
+ document indexschema {
+ struct part {
+ field text type string {}
+ field name type string {}
+ }
+
+ # string fields
+ field sa type string {
+ indexing: index
+ summary: dynamic
+ }
+ field sb type string {
+ indexing: index
+ }
+ field sc type string {
+ indexing: index
+ }
+ field sd type string {
+ indexing: index
+ rank:literal
+ }
+ field pos type position {
+ indexing: attribute
+ }
+ field se type string {
+ indexing: attribute
+ }
+ field sf type array<string> {
+ indexing: index
+ }
+ field sg type weightedset<string> {
+ indexing: index
+ }
+ field sh type uri {
+ indexing: index
+ }
+ field si type string {
+ indexing: index
+ index {
+ prefix
+ }
+ }
+ field exact1 type string {
+ indexing: index
+ match: exact
+ }
+ field exact2 type string {
+ indexing: index
+ match {
+ exact
+ }
+ }
+
+ # integer fields
+ field ia type int {
+ indexing: index
+ }
+ field ib type int {
+ indexing: index
+ }
+ field ic type int {
+ indexing: attribute
+ }
+
+ field nostemstring1 type string {
+ indexing: index | summary
+ index {
+ stemming: none
+ }
+ }
+
+ field nostemstring2 type string {
+ indexing: index | summary
+ index {
+ stemming: none
+ }
+ }
+
+ field nostemstring3 type string {
+ indexing: index | summary
+ stemming: none
+ }
+
+ field nostemstring4 type string {
+ indexing: index | summary
+ stemming: none
+ }
+
+ field fs9 type string {
+ indexing:index|summary
+ }
+
+ field f10 type array<part> {
+ struct-field text {
+ indexing: index|summary
+ }
+ }
+
+ }
+ fieldset fs9 {
+ fields:se
+ }
+ fieldset fs1 {
+ fields: se, sf, sg
+ }
+ fieldset fs2 {
+ fields: si
+ }
+ fieldset fs3 {
+ fields: ib, ic
+ }
+ fieldset fs4 {
+ fields: sa, sb
+ }
+ fieldset onlyattrib {
+ fields: se
+ }
+ fieldset exactfields {
+ fields: exact1, exact2
+ }
+
+ fieldset exactexplicit {
+ fields:sa, sb
+ query-command: "exact ARNOLD"
+ query-command: dynteaser
+ }
+
+ fieldset exactexplicit2 {
+ fields:sc, sd
+ match {
+ exact
+ exact-terminator: "Arnold"
+ }
+ }
+
+ fieldset gram {
+ fields: sc, sd
+ match: gram
+ }
+
+ fieldset nostem1 {
+ fields: nostemstring1, nostemstring2
+ }
+
+ fieldset nostem2 {
+ fields: nostemstring3, nostemstring4
+ }
+
+ fieldset default {
+ fields: sb, sc
+ }
+
+
+}
+
diff --git a/config-model/src/test/derived/indexschema/vsmfields.cfg b/config-model/src/test/derived/indexschema/vsmfields.cfg
new file mode 100644
index 00000000000..74d41e1cb6f
--- /dev/null
+++ b/config-model/src/test/derived/indexschema/vsmfields.cfg
@@ -0,0 +1,194 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "sa"
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 ""
+fieldspec[0].maxlength 1048576
+fieldspec[0].fieldtype INDEX
+fieldspec[1].name "sb"
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 ""
+fieldspec[1].maxlength 1048576
+fieldspec[1].fieldtype INDEX
+fieldspec[2].name "sc"
+fieldspec[2].searchmethod AUTOUTF8
+fieldspec[2].arg1 ""
+fieldspec[2].maxlength 1048576
+fieldspec[2].fieldtype INDEX
+fieldspec[3].name "sd"
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 ""
+fieldspec[3].maxlength 1048576
+fieldspec[3].fieldtype INDEX
+fieldspec[4].name "se"
+fieldspec[4].searchmethod AUTOUTF8
+fieldspec[4].arg1 "word"
+fieldspec[4].maxlength 1048576
+fieldspec[4].fieldtype ATTRIBUTE
+fieldspec[5].name "sf"
+fieldspec[5].searchmethod AUTOUTF8
+fieldspec[5].arg1 ""
+fieldspec[5].maxlength 1048576
+fieldspec[5].fieldtype INDEX
+fieldspec[6].name "sg"
+fieldspec[6].searchmethod AUTOUTF8
+fieldspec[6].arg1 ""
+fieldspec[6].maxlength 1048576
+fieldspec[6].fieldtype INDEX
+fieldspec[7].name "sh"
+fieldspec[7].searchmethod AUTOUTF8
+fieldspec[7].arg1 ""
+fieldspec[7].maxlength 1048576
+fieldspec[7].fieldtype INDEX
+fieldspec[8].name "si"
+fieldspec[8].searchmethod AUTOUTF8
+fieldspec[8].arg1 ""
+fieldspec[8].maxlength 1048576
+fieldspec[8].fieldtype INDEX
+fieldspec[9].name "exact1"
+fieldspec[9].searchmethod AUTOUTF8
+fieldspec[9].arg1 "exact"
+fieldspec[9].maxlength 1048576
+fieldspec[9].fieldtype INDEX
+fieldspec[10].name "exact2"
+fieldspec[10].searchmethod AUTOUTF8
+fieldspec[10].arg1 "exact"
+fieldspec[10].maxlength 1048576
+fieldspec[10].fieldtype INDEX
+fieldspec[11].name "ia"
+fieldspec[11].searchmethod INT32
+fieldspec[11].arg1 ""
+fieldspec[11].maxlength 1048576
+fieldspec[11].fieldtype ATTRIBUTE
+fieldspec[12].name "ib"
+fieldspec[12].searchmethod INT32
+fieldspec[12].arg1 ""
+fieldspec[12].maxlength 1048576
+fieldspec[12].fieldtype ATTRIBUTE
+fieldspec[13].name "ic"
+fieldspec[13].searchmethod INT32
+fieldspec[13].arg1 ""
+fieldspec[13].maxlength 1048576
+fieldspec[13].fieldtype ATTRIBUTE
+fieldspec[14].name "nostemstring1"
+fieldspec[14].searchmethod AUTOUTF8
+fieldspec[14].arg1 ""
+fieldspec[14].maxlength 1048576
+fieldspec[14].fieldtype INDEX
+fieldspec[15].name "nostemstring2"
+fieldspec[15].searchmethod AUTOUTF8
+fieldspec[15].arg1 ""
+fieldspec[15].maxlength 1048576
+fieldspec[15].fieldtype INDEX
+fieldspec[16].name "nostemstring3"
+fieldspec[16].searchmethod AUTOUTF8
+fieldspec[16].arg1 ""
+fieldspec[16].maxlength 1048576
+fieldspec[16].fieldtype INDEX
+fieldspec[17].name "nostemstring4"
+fieldspec[17].searchmethod AUTOUTF8
+fieldspec[17].arg1 ""
+fieldspec[17].maxlength 1048576
+fieldspec[17].fieldtype INDEX
+fieldspec[18].name "fs9"
+fieldspec[18].searchmethod AUTOUTF8
+fieldspec[18].arg1 ""
+fieldspec[18].maxlength 1048576
+fieldspec[18].fieldtype INDEX
+fieldspec[19].name "f10.text"
+fieldspec[19].searchmethod AUTOUTF8
+fieldspec[19].arg1 ""
+fieldspec[19].maxlength 1048576
+fieldspec[19].fieldtype INDEX
+fieldspec[20].name "sd_literal"
+fieldspec[20].searchmethod AUTOUTF8
+fieldspec[20].arg1 ""
+fieldspec[20].maxlength 1048576
+fieldspec[20].fieldtype INDEX
+fieldspec[21].name "pos_zcurve"
+fieldspec[21].searchmethod INT64
+fieldspec[21].arg1 ""
+fieldspec[21].maxlength 1048576
+fieldspec[21].fieldtype ATTRIBUTE
+documenttype[0].name "indexschema"
+documenttype[0].index[0].name "sa"
+documenttype[0].index[0].field[0].name "sa"
+documenttype[0].index[1].name "sb"
+documenttype[0].index[1].field[0].name "sb"
+documenttype[0].index[2].name "sc"
+documenttype[0].index[2].field[0].name "sc"
+documenttype[0].index[3].name "sd"
+documenttype[0].index[3].field[0].name "sd"
+documenttype[0].index[4].name "se"
+documenttype[0].index[4].field[0].name "se"
+documenttype[0].index[5].name "sf"
+documenttype[0].index[5].field[0].name "sf"
+documenttype[0].index[6].name "sg"
+documenttype[0].index[6].field[0].name "sg"
+documenttype[0].index[7].name "sh"
+documenttype[0].index[7].field[0].name "sh"
+documenttype[0].index[8].name "si"
+documenttype[0].index[8].field[0].name "si"
+documenttype[0].index[9].name "exact1"
+documenttype[0].index[9].field[0].name "exact1"
+documenttype[0].index[10].name "exact2"
+documenttype[0].index[10].field[0].name "exact2"
+documenttype[0].index[11].name "ia"
+documenttype[0].index[11].field[0].name "ia"
+documenttype[0].index[12].name "ib"
+documenttype[0].index[12].field[0].name "ib"
+documenttype[0].index[13].name "ic"
+documenttype[0].index[13].field[0].name "ic"
+documenttype[0].index[14].name "nostemstring1"
+documenttype[0].index[14].field[0].name "nostemstring1"
+documenttype[0].index[15].name "nostemstring2"
+documenttype[0].index[15].field[0].name "nostemstring2"
+documenttype[0].index[16].name "nostemstring3"
+documenttype[0].index[16].field[0].name "nostemstring3"
+documenttype[0].index[17].name "nostemstring4"
+documenttype[0].index[17].field[0].name "nostemstring4"
+documenttype[0].index[18].name "fs9"
+documenttype[0].index[18].field[0].name "se"
+documenttype[0].index[19].name "f10"
+documenttype[0].index[19].field[0].name "f10.text"
+documenttype[0].index[20].name "f10.text"
+documenttype[0].index[20].field[0].name "f10.text"
+documenttype[0].index[21].name "sd_literal"
+documenttype[0].index[21].field[0].name "sd_literal"
+documenttype[0].index[22].name "pos_zcurve"
+documenttype[0].index[22].field[0].name "pos_zcurve"
+documenttype[0].index[23].name "fs1"
+documenttype[0].index[23].field[0].name "se"
+documenttype[0].index[23].field[1].name "sf"
+documenttype[0].index[23].field[2].name "sg"
+documenttype[0].index[24].name "fs2"
+documenttype[0].index[24].field[0].name "si"
+documenttype[0].index[25].name "fs3"
+documenttype[0].index[25].field[0].name "ib"
+documenttype[0].index[25].field[1].name "ic"
+documenttype[0].index[26].name "fs4"
+documenttype[0].index[26].field[0].name "sa"
+documenttype[0].index[26].field[1].name "sb"
+documenttype[0].index[27].name "onlyattrib"
+documenttype[0].index[27].field[0].name "se"
+documenttype[0].index[28].name "exactfields"
+documenttype[0].index[28].field[0].name "exact1"
+documenttype[0].index[28].field[1].name "exact2"
+documenttype[0].index[29].name "exactexplicit"
+documenttype[0].index[29].field[0].name "sa"
+documenttype[0].index[29].field[1].name "sb"
+documenttype[0].index[30].name "exactexplicit2"
+documenttype[0].index[30].field[0].name "sc"
+documenttype[0].index[30].field[1].name "sd"
+documenttype[0].index[31].name "gram"
+documenttype[0].index[31].field[0].name "sc"
+documenttype[0].index[31].field[1].name "sd"
+documenttype[0].index[32].name "nostem1"
+documenttype[0].index[32].field[0].name "nostemstring1"
+documenttype[0].index[32].field[1].name "nostemstring2"
+documenttype[0].index[33].name "nostem2"
+documenttype[0].index[33].field[0].name "nostemstring3"
+documenttype[0].index[33].field[1].name "nostemstring4"
+documenttype[0].index[34].name "default"
+documenttype[0].index[34].field[0].name "sb"
+documenttype[0].index[34].field[1].name "sc" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexswitches/attributes.cfg b/config-model/src/test/derived/indexswitches/attributes.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/attributes.cfg
diff --git a/config-model/src/test/derived/indexswitches/documentmanager.cfg b/config-model/src/test/derived/indexswitches/documentmanager.cfg
new file mode 100644
index 00000000000..0a32e670d7b
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/documentmanager.cfg
@@ -0,0 +1,50 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -555640823
+datatype[1].structtype[0].name "indexswitches.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "title"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "descr"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "source_src"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[3].name "source"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[4].name "rankfeatures"
+datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[5].name "summaryfeatures"
+datatype[1].structtype[0].field[5].datatype 2
+datatype[2].id -1892617122
+datatype[2].structtype[0].name "indexswitches.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id -753375626
+datatype[3].documenttype[0].name "indexswitches"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -555640823
+datatype[3].documenttype[0].bodystruct -1892617122
+datatype[3].documenttype[0].fieldsets{default}.fields[0] "descr"
+datatype[3].documenttype[0].fieldsets{default}.fields[1] "title"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[0] "descr"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[1] "source_src"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[2] "title"
diff --git a/config-model/src/test/derived/indexswitches/ilscripts.cfg b/config-model/src/test/derived/indexswitches/ilscripts.cfg
new file mode 100644
index 00000000000..706f4105224
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/ilscripts.cfg
@@ -0,0 +1,9 @@
+maxtermoccurrences 100
+ilscript[0].doctype "indexswitches"
+ilscript[0].docfield[0] "title"
+ilscript[0].docfield[1] "descr"
+ilscript[0].docfield[2] "source_src"
+ilscript[0].content[0] "clear_state | guard { input source_src | switch { case \"theweb\": input source_src | tokenize normalize | summary source | index source; case \"amg\": input source_src | tokenize normalize | summary source; default: input source_src . \" partner\" | tokenize normalize | summary source | index source; }; }"
+ilscript[0].content[1] "clear_state | guard { input title | tokenize normalize stem:\"SHORTEST\" | summary title | index title; }"
+ilscript[0].content[2] "clear_state | guard { input descr | tokenize normalize stem:\"SHORTEST\" | summary descr | index descr; }"
+ilscript[0].content[3] "input source_src | passthrough source_src" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexswitches/index-info.cfg b/config-model/src/test/derived/indexswitches/index-info.cfg
new file mode 100644
index 00000000000..3daf23f8b67
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/index-info.cfg
@@ -0,0 +1,41 @@
+indexinfo[0].name "indexswitches"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "title"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "default"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "title"
+indexinfo[0].command[4].command "lowercase"
+indexinfo[0].command[5].indexname "default"
+indexinfo[0].command[5].command "lowercase"
+indexinfo[0].command[6].indexname "title"
+indexinfo[0].command[6].command "stem:SHORTEST"
+indexinfo[0].command[7].indexname "default"
+indexinfo[0].command[7].command "stem:SHORTEST"
+indexinfo[0].command[8].indexname "title"
+indexinfo[0].command[8].command "normalize"
+indexinfo[0].command[9].indexname "default"
+indexinfo[0].command[9].command "normalize"
+indexinfo[0].command[10].indexname "descr"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "descr"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "descr"
+indexinfo[0].command[12].command "stem:SHORTEST"
+indexinfo[0].command[13].indexname "descr"
+indexinfo[0].command[13].command "normalize"
+indexinfo[0].command[14].indexname "source_src"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "rankfeatures"
+indexinfo[0].command[15].command "index"
+indexinfo[0].command[16].indexname "source"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "source"
+indexinfo[0].command[17].command "lowercase"
+indexinfo[0].command[18].indexname "source"
+indexinfo[0].command[18].command "normalize"
+indexinfo[0].command[19].indexname "summaryfeatures"
+indexinfo[0].command[19].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexswitches/indexswitches.sd b/config-model/src/test/derived/indexswitches/indexswitches.sd
new file mode 100644
index 00000000000..9b08a0c9386
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/indexswitches.sd
@@ -0,0 +1,32 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search indexswitches {
+
+ document indexswitches {
+
+ field title type string {
+ indexing: summary | index
+ }
+
+ field descr type string {
+ indexing: summary | index
+ }
+
+ field source_src type string {
+
+ }
+ }
+ field source type string {
+ indexing {
+ input source_src |
+ switch {
+ case "amg": input source_src | summary;
+ case "theweb": input source_src | summary | index;
+ default: input source_src . " partner" | summary | index;
+ };
+ }
+ stemming: none
+ }
+ fieldset default {
+ fields: title, descr
+ }
+}
diff --git a/config-model/src/test/derived/indexswitches/rank-profiles.cfg b/config-model/src/test/derived/indexswitches/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexswitches/summary.cfg b/config-model/src/test/derived/indexswitches/summary.cfg
new file mode 100644
index 00000000000..8644ad1262b
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/summary.cfg
@@ -0,0 +1,15 @@
+defaultsummaryid 1698765342
+classes[0].id 1698765342
+classes[0].name "default"
+classes[0].fields[0].name "source"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "title"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "descr"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "rankfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "summaryfeatures"
+classes[0].fields[4].type "featuredata"
+classes[0].fields[5].name "documentid"
+classes[0].fields[5].type "longstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/indexswitches/summarymap.cfg b/config-model/src/test/derived/indexswitches/summarymap.cfg
new file mode 100644
index 00000000000..42b6e811ee6
--- /dev/null
+++ b/config-model/src/test/derived/indexswitches/summarymap.cfg
@@ -0,0 +1,7 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/inheritance/attributes.cfg b/config-model/src/test/derived/inheritance/attributes.cfg
new file mode 100644
index 00000000000..b9870b21975
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/attributes.cfg
@@ -0,0 +1,10 @@
+attribute[3]
+attribute[onlygrandparent].collectiontype SINGLE
+attribute[onlygrandparent].datatype INT32
+attribute[onlygrandparent].name "onlygrandparent"
+attribute[onlymother].collectiontype SINGLE
+attribute[onlymother].datatype STRING
+attribute[onlymother].name "onlymother"
+attribute[overridden].collectiontype SINGLE
+attribute[overridden].datatype INT32
+attribute[overridden].name "overridden"
diff --git a/config-model/src/test/derived/inheritance/child.sd b/config-model/src/test/derived/inheritance/child.sd
new file mode 100644
index 00000000000..099e9cab0ee
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/child.sd
@@ -0,0 +1,16 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+
+ document child inherits father, mother {
+
+ field onlychild type string {
+ indexing: index
+ }
+
+ field overridden type int {
+ indexing: index
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/inheritance/documentmanager.cfg b/config-model/src/test/derived/inheritance/documentmanager.cfg
new file mode 100644
index 00000000000..21e65acf67d
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/documentmanager.cfg
@@ -0,0 +1,426 @@
+enablecompression false
+annotationtype[0]
+datatype[29]
+datatype[-126593034].id -126593034
+datatype[-126593034].annotationreftype[0]
+datatype[-126593034].arraytype[0]
+datatype[-126593034].documenttype[0]
+datatype[-126593034].structtype[1]
+datatype[-126593034].structtype[single].name "child.body"
+datatype[-126593034].structtype[single].version 0
+datatype[-126593034].structtype[single].field[0]
+datatype[-126593034].structtype[single].inherits[0]
+datatype[-126593034].weightedsettype[0]
+datatype[-141935690].id -141935690
+datatype[-141935690].annotationreftype[0]
+datatype[-141935690].arraytype[0]
+datatype[-141935690].documenttype[0]
+datatype[-141935690].structtype[1]
+datatype[-141935690].structtype[single].name "search_smartsummary"
+datatype[-141935690].structtype[single].version 0
+datatype[-141935690].structtype[single].field[3]
+datatype[-141935690].structtype[single].field[abstract].datatype 2
+datatype[-141935690].structtype[single].field[abstract].name "abstract"
+datatype[-141935690].structtype[single].field[abstract].id[0]
+datatype[-141935690].structtype[single].field[dispurl].datatype 2
+datatype[-141935690].structtype[single].field[dispurl].name "dispurl"
+datatype[-141935690].structtype[single].field[dispurl].id[0]
+datatype[-141935690].structtype[single].field[title].datatype 2
+datatype[-141935690].structtype[single].field[title].name "title"
+datatype[-141935690].structtype[single].field[title].id[0]
+datatype[-141935690].structtype[single].inherits[0]
+datatype[-141935690].weightedsettype[0]
+datatype[-1467672569].id -1467672569
+datatype[-1467672569].annotationreftype[0]
+datatype[-1467672569].arraytype[0]
+datatype[-1467672569].documenttype[0]
+datatype[-1467672569].structtype[1]
+datatype[-1467672569].structtype[single].name "child_search.body"
+datatype[-1467672569].structtype[single].version 0
+datatype[-1467672569].structtype[single].field[0]
+datatype[-1467672569].structtype[single].inherits[0]
+datatype[-1467672569].weightedsettype[0]
+datatype[-154107656].id -154107656
+datatype[-154107656].annotationreftype[0]
+datatype[-154107656].arraytype[0]
+datatype[-154107656].documenttype[1]
+datatype[-154107656].documenttype[single].bodystruct 978262812
+datatype[-154107656].documenttype[single].headerstruct 990971719
+datatype[-154107656].documenttype[single].name "grandparent"
+datatype[-154107656].documenttype[single].version 0
+datatype[-154107656].documenttype[single].inherits[0]
+datatype[-154107656].structtype[0]
+datatype[-154107656].weightedsettype[0]
+datatype[-158393403].id -158393403
+datatype[-158393403].annotationreftype[0]
+datatype[-158393403].arraytype[0]
+datatype[-158393403].documenttype[1]
+datatype[-158393403].documenttype[single].bodystruct -1989003153
+datatype[-158393403].documenttype[single].headerstruct 1306663898
+datatype[-158393403].documenttype[single].name "mother"
+datatype[-158393403].documenttype[single].version 0
+datatype[-158393403].documenttype[single].inherits[1]
+datatype[-158393403].documenttype[single].inherits[grandparent].name "grandparent"
+datatype[-158393403].documenttype[single].inherits[grandparent].version 0
+datatype[-158393403].structtype[0]
+datatype[-158393403].weightedsettype[0]
+datatype[-1740240543].id -1740240543
+datatype[-1740240543].annotationreftype[0]
+datatype[-1740240543].arraytype[0]
+datatype[-1740240543].documenttype[0]
+datatype[-1740240543].structtype[1]
+datatype[-1740240543].structtype[single].name "search_feature"
+datatype[-1740240543].structtype[single].version 0
+datatype[-1740240543].structtype[single].field[2]
+datatype[-1740240543].structtype[single].field[name].datatype 2
+datatype[-1740240543].structtype[single].field[name].name "name"
+datatype[-1740240543].structtype[single].field[name].id[0]
+datatype[-1740240543].structtype[single].field[value].datatype 5
+datatype[-1740240543].structtype[single].field[value].name "value"
+datatype[-1740240543].structtype[single].field[value].id[0]
+datatype[-1740240543].structtype[single].inherits[0]
+datatype[-1740240543].weightedsettype[0]
+datatype[-1742340170].id -1742340170
+datatype[-1742340170].annotationreftype[0]
+datatype[-1742340170].arraytype[0]
+datatype[-1742340170].documenttype[0]
+datatype[-1742340170].structtype[1]
+datatype[-1742340170].structtype[single].name "father.body"
+datatype[-1742340170].structtype[single].version 0
+datatype[-1742340170].structtype[single].field[0]
+datatype[-1742340170].structtype[single].inherits[0]
+datatype[-1742340170].weightedsettype[0]
+datatype[-1852215954].id -1852215954
+datatype[-1852215954].annotationreftype[0]
+datatype[-1852215954].arraytype[0]
+datatype[-1852215954].documenttype[0]
+datatype[-1852215954].structtype[1]
+datatype[-1852215954].structtype[single].name "mother_search.body"
+datatype[-1852215954].structtype[single].version 0
+datatype[-1852215954].structtype[single].field[0]
+datatype[-1852215954].structtype[single].inherits[0]
+datatype[-1852215954].weightedsettype[0]
+datatype[-1962244686].id -1962244686
+datatype[-1962244686].annotationreftype[0]
+datatype[-1962244686].arraytype[0]
+datatype[-1962244686].documenttype[0]
+datatype[-1962244686].structtype[1]
+datatype[-1962244686].structtype[single].name "father_search.header"
+datatype[-1962244686].structtype[single].version 0
+datatype[-1962244686].structtype[single].field[5]
+datatype[-1962244686].structtype[single].field[onlyfather].datatype 2
+datatype[-1962244686].structtype[single].field[onlyfather].name "onlyfather"
+datatype[-1962244686].structtype[single].field[onlyfather].id[0]
+datatype[-1962244686].structtype[single].field[onlygrandparent].datatype 0
+datatype[-1962244686].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-1962244686].structtype[single].field[onlygrandparent].id[0]
+datatype[-1962244686].structtype[single].field[overridden].datatype 0
+datatype[-1962244686].structtype[single].field[overridden].name "overridden"
+datatype[-1962244686].structtype[single].field[overridden].id[0]
+datatype[-1962244686].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-1962244686].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-1962244686].structtype[single].field[rankfeatures].id[0]
+datatype[-1962244686].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-1962244686].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-1962244686].structtype[single].field[summaryfeatures].id[0]
+datatype[-1962244686].structtype[single].inherits[0]
+datatype[-1962244686].weightedsettype[0]
+datatype[-1989003153].id -1989003153
+datatype[-1989003153].annotationreftype[0]
+datatype[-1989003153].arraytype[0]
+datatype[-1989003153].documenttype[0]
+datatype[-1989003153].structtype[1]
+datatype[-1989003153].structtype[single].name "mother.body"
+datatype[-1989003153].structtype[single].version 0
+datatype[-1989003153].structtype[single].field[0]
+datatype[-1989003153].structtype[single].inherits[0]
+datatype[-1989003153].weightedsettype[0]
+datatype[-205818510].id -205818510
+datatype[-205818510].annotationreftype[0]
+datatype[-205818510].arraytype[0]
+datatype[-205818510].documenttype[0]
+datatype[-205818510].structtype[1]
+datatype[-205818510].structtype[single].name "child_search.header"
+datatype[-205818510].structtype[single].version 0
+datatype[-205818510].structtype[single].field[7]
+datatype[-205818510].structtype[single].field[onlychild].datatype 2
+datatype[-205818510].structtype[single].field[onlychild].name "onlychild"
+datatype[-205818510].structtype[single].field[onlychild].id[0]
+datatype[-205818510].structtype[single].field[onlyfather].datatype 2
+datatype[-205818510].structtype[single].field[onlyfather].name "onlyfather"
+datatype[-205818510].structtype[single].field[onlyfather].id[0]
+datatype[-205818510].structtype[single].field[onlygrandparent].datatype 0
+datatype[-205818510].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-205818510].structtype[single].field[onlygrandparent].id[0]
+datatype[-205818510].structtype[single].field[onlymother].datatype 2
+datatype[-205818510].structtype[single].field[onlymother].name "onlymother"
+datatype[-205818510].structtype[single].field[onlymother].id[0]
+datatype[-205818510].structtype[single].field[overridden].datatype 0
+datatype[-205818510].structtype[single].field[overridden].name "overridden"
+datatype[-205818510].structtype[single].field[overridden].id[0]
+datatype[-205818510].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-205818510].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-205818510].structtype[single].field[rankfeatures].id[0]
+datatype[-205818510].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-205818510].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-205818510].structtype[single].field[summaryfeatures].id[0]
+datatype[-205818510].structtype[single].inherits[0]
+datatype[-205818510].weightedsettype[0]
+datatype[-384824039].id -384824039
+datatype[-384824039].annotationreftype[0]
+datatype[-384824039].arraytype[0]
+datatype[-384824039].documenttype[0]
+datatype[-384824039].structtype[1]
+datatype[-384824039].structtype[single].name "mother_search.header"
+datatype[-384824039].structtype[single].version 0
+datatype[-384824039].structtype[single].field[5]
+datatype[-384824039].structtype[single].field[onlygrandparent].datatype 0
+datatype[-384824039].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-384824039].structtype[single].field[onlygrandparent].id[0]
+datatype[-384824039].structtype[single].field[onlymother].datatype 2
+datatype[-384824039].structtype[single].field[onlymother].name "onlymother"
+datatype[-384824039].structtype[single].field[onlymother].id[0]
+datatype[-384824039].structtype[single].field[overridden].datatype 0
+datatype[-384824039].structtype[single].field[overridden].name "overridden"
+datatype[-384824039].structtype[single].field[overridden].id[0]
+datatype[-384824039].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-384824039].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-384824039].structtype[single].field[rankfeatures].id[0]
+datatype[-384824039].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-384824039].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-384824039].structtype[single].field[summaryfeatures].id[0]
+datatype[-384824039].structtype[single].inherits[0]
+datatype[-384824039].weightedsettype[0]
+datatype[-52742073].id -52742073
+datatype[-52742073].annotationreftype[0]
+datatype[-52742073].arraytype[0]
+datatype[-52742073].documenttype[0]
+datatype[-52742073].structtype[1]
+datatype[-52742073].structtype[single].name "father_search.body"
+datatype[-52742073].structtype[single].version 0
+datatype[-52742073].structtype[single].field[0]
+datatype[-52742073].structtype[single].inherits[0]
+datatype[-52742073].weightedsettype[0]
+datatype[-580592339].id -580592339
+datatype[-580592339].annotationreftype[0]
+datatype[-580592339].arraytype[0]
+datatype[-580592339].documenttype[1]
+datatype[-580592339].documenttype[single].bodystruct -1467672569
+datatype[-580592339].documenttype[single].headerstruct -205818510
+datatype[-580592339].documenttype[single].name "child_search"
+datatype[-580592339].documenttype[single].version 0
+datatype[-580592339].documenttype[single].inherits[0]
+datatype[-580592339].structtype[0]
+datatype[-580592339].weightedsettype[0]
+datatype[-876064862].id -876064862
+datatype[-876064862].annotationreftype[0]
+datatype[-876064862].arraytype[0]
+datatype[-876064862].documenttype[0]
+datatype[-876064862].structtype[1]
+datatype[-876064862].structtype[single].name "search_position"
+datatype[-876064862].structtype[single].version 0
+datatype[-876064862].structtype[single].field[2]
+datatype[-876064862].structtype[single].field[x].datatype 0
+datatype[-876064862].structtype[single].field[x].name "x"
+datatype[-876064862].structtype[single].field[x].id[0]
+datatype[-876064862].structtype[single].field[y].datatype 0
+datatype[-876064862].structtype[single].field[y].name "y"
+datatype[-876064862].structtype[single].field[y].id[0]
+datatype[-876064862].structtype[single].inherits[0]
+datatype[-876064862].weightedsettype[0]
+datatype[1306663898].id 1306663898
+datatype[1306663898].annotationreftype[0]
+datatype[1306663898].arraytype[0]
+datatype[1306663898].documenttype[0]
+datatype[1306663898].structtype[1]
+datatype[1306663898].structtype[single].name "mother.header"
+datatype[1306663898].structtype[single].version 0
+datatype[1306663898].structtype[single].field[1]
+datatype[1306663898].structtype[single].field[onlymother].datatype 2
+datatype[1306663898].structtype[single].field[onlymother].name "onlymother"
+datatype[1306663898].structtype[single].field[onlymother].id[0]
+datatype[1306663898].structtype[single].inherits[0]
+datatype[1306663898].weightedsettype[0]
+datatype[1464571117].id 1464571117
+datatype[1464571117].annotationreftype[0]
+datatype[1464571117].arraytype[0]
+datatype[1464571117].documenttype[1]
+datatype[1464571117].documenttype[single].bodystruct -52742073
+datatype[1464571117].documenttype[single].headerstruct -1962244686
+datatype[1464571117].documenttype[single].name "father_search"
+datatype[1464571117].documenttype[single].version 0
+datatype[1464571117].documenttype[single].inherits[0]
+datatype[1464571117].structtype[0]
+datatype[1464571117].weightedsettype[0]
+datatype[147991900].id 147991900
+datatype[147991900].annotationreftype[0]
+datatype[147991900].arraytype[1]
+datatype[147991900].arraytype[single].datatype -1740240543
+datatype[147991900].documenttype[0]
+datatype[147991900].structtype[0]
+datatype[147991900].weightedsettype[0]
+datatype[1530060044].id 1530060044
+datatype[1530060044].annotationreftype[0]
+datatype[1530060044].arraytype[0]
+datatype[1530060044].documenttype[0]
+datatype[1530060044].structtype[1]
+datatype[1530060044].structtype[single].name "grandparent_search.header"
+datatype[1530060044].structtype[single].version 0
+datatype[1530060044].structtype[single].field[4]
+datatype[1530060044].structtype[single].field[onlygrandparent].datatype 0
+datatype[1530060044].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[1530060044].structtype[single].field[onlygrandparent].id[0]
+datatype[1530060044].structtype[single].field[overridden].datatype 0
+datatype[1530060044].structtype[single].field[overridden].name "overridden"
+datatype[1530060044].structtype[single].field[overridden].id[0]
+datatype[1530060044].structtype[single].field[rankfeatures].datatype 147991900
+datatype[1530060044].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[1530060044].structtype[single].field[rankfeatures].id[0]
+datatype[1530060044].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[1530060044].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[1530060044].structtype[single].field[summaryfeatures].id[0]
+datatype[1530060044].structtype[single].inherits[0]
+datatype[1530060044].weightedsettype[0]
+datatype[1845861921].id 1845861921
+datatype[1845861921].annotationreftype[0]
+datatype[1845861921].arraytype[0]
+datatype[1845861921].documenttype[0]
+datatype[1845861921].structtype[1]
+datatype[1845861921].structtype[single].name "grandparent_search.body"
+datatype[1845861921].structtype[single].version 0
+datatype[1845861921].structtype[single].field[0]
+datatype[1845861921].structtype[single].inherits[0]
+datatype[1845861921].weightedsettype[0]
+datatype[2126589281].id 2126589281
+datatype[2126589281].annotationreftype[0]
+datatype[2126589281].arraytype[0]
+datatype[2126589281].documenttype[0]
+datatype[2126589281].structtype[1]
+datatype[2126589281].structtype[single].name "father.header"
+datatype[2126589281].structtype[single].version 0
+datatype[2126589281].structtype[single].field[1]
+datatype[2126589281].structtype[single].field[onlyfather].datatype 2
+datatype[2126589281].structtype[single].field[onlyfather].name "onlyfather"
+datatype[2126589281].structtype[single].field[onlyfather].id[0]
+datatype[2126589281].structtype[single].inherits[0]
+datatype[2126589281].weightedsettype[0]
+datatype[328953555].id 328953555
+datatype[328953555].annotationreftype[0]
+datatype[328953555].arraytype[0]
+datatype[328953555].documenttype[1]
+datatype[328953555].documenttype[single].bodystruct 1845861921
+datatype[328953555].documenttype[single].headerstruct 1530060044
+datatype[328953555].documenttype[single].name "grandparent_search"
+datatype[328953555].documenttype[single].version 0
+datatype[328953555].documenttype[single].inherits[0]
+datatype[328953555].structtype[0]
+datatype[328953555].weightedsettype[0]
+datatype[464784087].id 464784087
+datatype[464784087].annotationreftype[0]
+datatype[464784087].arraytype[0]
+datatype[464784087].documenttype[0]
+datatype[464784087].structtype[1]
+datatype[464784087].structtype[single].name "search_uri"
+datatype[464784087].structtype[single].version 0
+datatype[464784087].structtype[single].field[7]
+datatype[464784087].structtype[single].field[all].datatype 2
+datatype[464784087].structtype[single].field[all].name "all"
+datatype[464784087].structtype[single].field[all].id[0]
+datatype[464784087].structtype[single].field[fragment].datatype 2
+datatype[464784087].structtype[single].field[fragment].name "fragment"
+datatype[464784087].structtype[single].field[fragment].id[0]
+datatype[464784087].structtype[single].field[host].datatype 2
+datatype[464784087].structtype[single].field[host].name "host"
+datatype[464784087].structtype[single].field[host].id[0]
+datatype[464784087].structtype[single].field[path].datatype 2
+datatype[464784087].structtype[single].field[path].name "path"
+datatype[464784087].structtype[single].field[path].id[0]
+datatype[464784087].structtype[single].field[port].datatype 0
+datatype[464784087].structtype[single].field[port].name "port"
+datatype[464784087].structtype[single].field[port].id[0]
+datatype[464784087].structtype[single].field[query].datatype 2
+datatype[464784087].structtype[single].field[query].name "query"
+datatype[464784087].structtype[single].field[query].id[0]
+datatype[464784087].structtype[single].field[scheme].datatype 2
+datatype[464784087].structtype[single].field[scheme].name "scheme"
+datatype[464784087].structtype[single].field[scheme].id[0]
+datatype[464784087].structtype[single].inherits[0]
+datatype[464784087].weightedsettype[0]
+datatype[644645734].id 644645734
+datatype[644645734].annotationreftype[0]
+datatype[644645734].arraytype[0]
+datatype[644645734].documenttype[1]
+datatype[644645734].documenttype[single].bodystruct -1852215954
+datatype[644645734].documenttype[single].headerstruct -384824039
+datatype[644645734].documenttype[single].name "mother_search"
+datatype[644645734].documenttype[single].version 0
+datatype[644645734].documenttype[single].inherits[0]
+datatype[644645734].structtype[0]
+datatype[644645734].weightedsettype[0]
+datatype[746267614].id 746267614
+datatype[746267614].annotationreftype[0]
+datatype[746267614].arraytype[0]
+datatype[746267614].documenttype[1]
+datatype[746267614].documenttype[single].bodystruct -126593034
+datatype[746267614].documenttype[single].headerstruct 81425825
+datatype[746267614].documenttype[single].name "child"
+datatype[746267614].documenttype[single].version 0
+datatype[746267614].documenttype[single].inherits[2]
+datatype[746267614].documenttype[single].inherits[father].name "father"
+datatype[746267614].documenttype[single].inherits[father].version 0
+datatype[746267614].documenttype[single].inherits[mother].name "mother"
+datatype[746267614].documenttype[single].inherits[mother].version 0
+datatype[746267614].structtype[0]
+datatype[746267614].weightedsettype[0]
+datatype[81425825].id 81425825
+datatype[81425825].annotationreftype[0]
+datatype[81425825].arraytype[0]
+datatype[81425825].documenttype[0]
+datatype[81425825].structtype[1]
+datatype[81425825].structtype[single].name "child.header"
+datatype[81425825].structtype[single].version 0
+datatype[81425825].structtype[single].field[1]
+datatype[81425825].structtype[single].field[onlychild].datatype 2
+datatype[81425825].structtype[single].field[onlychild].name "onlychild"
+datatype[81425825].structtype[single].field[onlychild].id[0]
+datatype[81425825].structtype[single].inherits[0]
+datatype[81425825].weightedsettype[0]
+datatype[978262812].id 978262812
+datatype[978262812].annotationreftype[0]
+datatype[978262812].arraytype[0]
+datatype[978262812].documenttype[0]
+datatype[978262812].structtype[1]
+datatype[978262812].structtype[single].name "grandparent.body"
+datatype[978262812].structtype[single].version 0
+datatype[978262812].structtype[single].field[0]
+datatype[978262812].structtype[single].inherits[0]
+datatype[978262812].weightedsettype[0]
+datatype[986686494].id 986686494
+datatype[986686494].annotationreftype[0]
+datatype[986686494].arraytype[0]
+datatype[986686494].documenttype[1]
+datatype[986686494].documenttype[single].bodystruct -1742340170
+datatype[986686494].documenttype[single].headerstruct 2126589281
+datatype[986686494].documenttype[single].name "father"
+datatype[986686494].documenttype[single].version 0
+datatype[986686494].documenttype[single].inherits[1]
+datatype[986686494].documenttype[single].inherits[grandparent].name "grandparent"
+datatype[986686494].documenttype[single].inherits[grandparent].version 0
+datatype[986686494].structtype[0]
+datatype[986686494].weightedsettype[0]
+datatype[990971719].id 990971719
+datatype[990971719].annotationreftype[0]
+datatype[990971719].arraytype[0]
+datatype[990971719].documenttype[0]
+datatype[990971719].structtype[1]
+datatype[990971719].structtype[single].name "grandparent.header"
+datatype[990971719].structtype[single].version 0
+datatype[990971719].structtype[single].field[2]
+datatype[990971719].structtype[single].field[onlygrandparent].datatype 0
+datatype[990971719].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[990971719].structtype[single].field[onlygrandparent].id[0]
+datatype[990971719].structtype[single].field[overridden].datatype 0
+datatype[990971719].structtype[single].field[overridden].name "overridden"
+datatype[990971719].structtype[single].field[overridden].id[0]
+datatype[990971719].structtype[single].inherits[0]
+datatype[990971719].weightedsettype[0]
diff --git a/config-model/src/test/derived/inheritance/father.sd b/config-model/src/test/derived/inheritance/father.sd
new file mode 100644
index 00000000000..de4287334c2
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/father.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+document father inherits grandparent {
+
+ field onlyfather type string {
+ indexing: summary
+ }
+
+ field overridden type int {
+ indexing: summary
+ }
+
+}
diff --git a/config-model/src/test/derived/inheritance/grandparent.sd b/config-model/src/test/derived/inheritance/grandparent.sd
new file mode 100644
index 00000000000..5f1aa91b926
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/grandparent.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+document grandparent {
+
+ field onlygrandparent type int {
+ indexing: attribute
+ }
+
+ field overridden type int {
+ indexing: attribute
+ }
+
+}
diff --git a/config-model/src/test/derived/inheritance/ilscripts.cfg b/config-model/src/test/derived/inheritance/ilscripts.cfg
new file mode 100644
index 00000000000..8a9f8fe3c6f
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/ilscripts.cfg
@@ -0,0 +1,9 @@
+ilscript[1]
+ilscript[child].doctype "child"
+ilscript[child].name "child"
+ilscript[child].content[5]
+ilscript[child].content[0] "input onlygrandparent | attribute onlygrandparent"
+ilscript[child].content[1] "input overridden | attribute overridden"
+ilscript[child].content[2] "input onlyfather | summary onlyfather"
+ilscript[child].content[3] "input onlymother | tokenize normalize stem:\"SHORTEST\" | attribute onlymother | index onlymother"
+ilscript[child].content[4] "input onlychild | tokenize normalize stem:\"SHORTEST\" | index onlychild"
diff --git a/config-model/src/test/derived/inheritance/index-info.cfg b/config-model/src/test/derived/inheritance/index-info.cfg
new file mode 100644
index 00000000000..f58df991c40
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/index-info.cfg
@@ -0,0 +1,30 @@
+indexinfo[1]
+indexinfo[child].name "child"
+indexinfo[child].alias[0]
+indexinfo[child].command[13]
+indexinfo[child].command[00].command "index"
+indexinfo[child].command[00].indexname "sddocname"
+indexinfo[child].command[01].command "word"
+indexinfo[child].command[01].indexname "sddocname"
+indexinfo[child].command[02].command "index"
+indexinfo[child].command[02].indexname "onlychild"
+indexinfo[child].command[03].command "index"
+indexinfo[child].command[03].indexname "onlygrandparent"
+indexinfo[child].command[04].command "attribute"
+indexinfo[child].command[04].indexname "onlygrandparent"
+indexinfo[child].command[05].command "index"
+indexinfo[child].command[05].indexname "overridden"
+indexinfo[child].command[06].command "attribute"
+indexinfo[child].command[06].indexname "overridden"
+indexinfo[child].command[07].command "index"
+indexinfo[child].command[07].indexname "onlyfather"
+indexinfo[child].command[08].command "index"
+indexinfo[child].command[08].indexname "onlymother"
+indexinfo[child].command[09].command "stem:SHORTEST"
+indexinfo[child].command[09].indexname "onlymother"
+indexinfo[child].command[10].command "normalize"
+indexinfo[child].command[10].indexname "onlymother"
+indexinfo[child].command[11].command "stem:SHORTEST"
+indexinfo[child].command[11].indexname "onlychild"
+indexinfo[child].command[12].command "normalize"
+indexinfo[child].command[12].indexname "onlychild"
diff --git a/config-model/src/test/derived/inheritance/mother.sd b/config-model/src/test/derived/inheritance/mother.sd
new file mode 100644
index 00000000000..437616eabbc
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/mother.sd
@@ -0,0 +1,13 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+document mother inherits grandparent {
+
+ field onlymother type string {
+ indexing: attribute | index
+ index: prefix
+ }
+
+ field overridden type int {
+ indexing: attribute
+ }
+
+}
diff --git a/config-model/src/test/derived/inheritance/mother/documentmanager.cfg b/config-model/src/test/derived/inheritance/mother/documentmanager.cfg
new file mode 100644
index 00000000000..21e65acf67d
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/mother/documentmanager.cfg
@@ -0,0 +1,426 @@
+enablecompression false
+annotationtype[0]
+datatype[29]
+datatype[-126593034].id -126593034
+datatype[-126593034].annotationreftype[0]
+datatype[-126593034].arraytype[0]
+datatype[-126593034].documenttype[0]
+datatype[-126593034].structtype[1]
+datatype[-126593034].structtype[single].name "child.body"
+datatype[-126593034].structtype[single].version 0
+datatype[-126593034].structtype[single].field[0]
+datatype[-126593034].structtype[single].inherits[0]
+datatype[-126593034].weightedsettype[0]
+datatype[-141935690].id -141935690
+datatype[-141935690].annotationreftype[0]
+datatype[-141935690].arraytype[0]
+datatype[-141935690].documenttype[0]
+datatype[-141935690].structtype[1]
+datatype[-141935690].structtype[single].name "search_smartsummary"
+datatype[-141935690].structtype[single].version 0
+datatype[-141935690].structtype[single].field[3]
+datatype[-141935690].structtype[single].field[abstract].datatype 2
+datatype[-141935690].structtype[single].field[abstract].name "abstract"
+datatype[-141935690].structtype[single].field[abstract].id[0]
+datatype[-141935690].structtype[single].field[dispurl].datatype 2
+datatype[-141935690].structtype[single].field[dispurl].name "dispurl"
+datatype[-141935690].structtype[single].field[dispurl].id[0]
+datatype[-141935690].structtype[single].field[title].datatype 2
+datatype[-141935690].structtype[single].field[title].name "title"
+datatype[-141935690].structtype[single].field[title].id[0]
+datatype[-141935690].structtype[single].inherits[0]
+datatype[-141935690].weightedsettype[0]
+datatype[-1467672569].id -1467672569
+datatype[-1467672569].annotationreftype[0]
+datatype[-1467672569].arraytype[0]
+datatype[-1467672569].documenttype[0]
+datatype[-1467672569].structtype[1]
+datatype[-1467672569].structtype[single].name "child_search.body"
+datatype[-1467672569].structtype[single].version 0
+datatype[-1467672569].structtype[single].field[0]
+datatype[-1467672569].structtype[single].inherits[0]
+datatype[-1467672569].weightedsettype[0]
+datatype[-154107656].id -154107656
+datatype[-154107656].annotationreftype[0]
+datatype[-154107656].arraytype[0]
+datatype[-154107656].documenttype[1]
+datatype[-154107656].documenttype[single].bodystruct 978262812
+datatype[-154107656].documenttype[single].headerstruct 990971719
+datatype[-154107656].documenttype[single].name "grandparent"
+datatype[-154107656].documenttype[single].version 0
+datatype[-154107656].documenttype[single].inherits[0]
+datatype[-154107656].structtype[0]
+datatype[-154107656].weightedsettype[0]
+datatype[-158393403].id -158393403
+datatype[-158393403].annotationreftype[0]
+datatype[-158393403].arraytype[0]
+datatype[-158393403].documenttype[1]
+datatype[-158393403].documenttype[single].bodystruct -1989003153
+datatype[-158393403].documenttype[single].headerstruct 1306663898
+datatype[-158393403].documenttype[single].name "mother"
+datatype[-158393403].documenttype[single].version 0
+datatype[-158393403].documenttype[single].inherits[1]
+datatype[-158393403].documenttype[single].inherits[grandparent].name "grandparent"
+datatype[-158393403].documenttype[single].inherits[grandparent].version 0
+datatype[-158393403].structtype[0]
+datatype[-158393403].weightedsettype[0]
+datatype[-1740240543].id -1740240543
+datatype[-1740240543].annotationreftype[0]
+datatype[-1740240543].arraytype[0]
+datatype[-1740240543].documenttype[0]
+datatype[-1740240543].structtype[1]
+datatype[-1740240543].structtype[single].name "search_feature"
+datatype[-1740240543].structtype[single].version 0
+datatype[-1740240543].structtype[single].field[2]
+datatype[-1740240543].structtype[single].field[name].datatype 2
+datatype[-1740240543].structtype[single].field[name].name "name"
+datatype[-1740240543].structtype[single].field[name].id[0]
+datatype[-1740240543].structtype[single].field[value].datatype 5
+datatype[-1740240543].structtype[single].field[value].name "value"
+datatype[-1740240543].structtype[single].field[value].id[0]
+datatype[-1740240543].structtype[single].inherits[0]
+datatype[-1740240543].weightedsettype[0]
+datatype[-1742340170].id -1742340170
+datatype[-1742340170].annotationreftype[0]
+datatype[-1742340170].arraytype[0]
+datatype[-1742340170].documenttype[0]
+datatype[-1742340170].structtype[1]
+datatype[-1742340170].structtype[single].name "father.body"
+datatype[-1742340170].structtype[single].version 0
+datatype[-1742340170].structtype[single].field[0]
+datatype[-1742340170].structtype[single].inherits[0]
+datatype[-1742340170].weightedsettype[0]
+datatype[-1852215954].id -1852215954
+datatype[-1852215954].annotationreftype[0]
+datatype[-1852215954].arraytype[0]
+datatype[-1852215954].documenttype[0]
+datatype[-1852215954].structtype[1]
+datatype[-1852215954].structtype[single].name "mother_search.body"
+datatype[-1852215954].structtype[single].version 0
+datatype[-1852215954].structtype[single].field[0]
+datatype[-1852215954].structtype[single].inherits[0]
+datatype[-1852215954].weightedsettype[0]
+datatype[-1962244686].id -1962244686
+datatype[-1962244686].annotationreftype[0]
+datatype[-1962244686].arraytype[0]
+datatype[-1962244686].documenttype[0]
+datatype[-1962244686].structtype[1]
+datatype[-1962244686].structtype[single].name "father_search.header"
+datatype[-1962244686].structtype[single].version 0
+datatype[-1962244686].structtype[single].field[5]
+datatype[-1962244686].structtype[single].field[onlyfather].datatype 2
+datatype[-1962244686].structtype[single].field[onlyfather].name "onlyfather"
+datatype[-1962244686].structtype[single].field[onlyfather].id[0]
+datatype[-1962244686].structtype[single].field[onlygrandparent].datatype 0
+datatype[-1962244686].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-1962244686].structtype[single].field[onlygrandparent].id[0]
+datatype[-1962244686].structtype[single].field[overridden].datatype 0
+datatype[-1962244686].structtype[single].field[overridden].name "overridden"
+datatype[-1962244686].structtype[single].field[overridden].id[0]
+datatype[-1962244686].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-1962244686].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-1962244686].structtype[single].field[rankfeatures].id[0]
+datatype[-1962244686].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-1962244686].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-1962244686].structtype[single].field[summaryfeatures].id[0]
+datatype[-1962244686].structtype[single].inherits[0]
+datatype[-1962244686].weightedsettype[0]
+datatype[-1989003153].id -1989003153
+datatype[-1989003153].annotationreftype[0]
+datatype[-1989003153].arraytype[0]
+datatype[-1989003153].documenttype[0]
+datatype[-1989003153].structtype[1]
+datatype[-1989003153].structtype[single].name "mother.body"
+datatype[-1989003153].structtype[single].version 0
+datatype[-1989003153].structtype[single].field[0]
+datatype[-1989003153].structtype[single].inherits[0]
+datatype[-1989003153].weightedsettype[0]
+datatype[-205818510].id -205818510
+datatype[-205818510].annotationreftype[0]
+datatype[-205818510].arraytype[0]
+datatype[-205818510].documenttype[0]
+datatype[-205818510].structtype[1]
+datatype[-205818510].structtype[single].name "child_search.header"
+datatype[-205818510].structtype[single].version 0
+datatype[-205818510].structtype[single].field[7]
+datatype[-205818510].structtype[single].field[onlychild].datatype 2
+datatype[-205818510].structtype[single].field[onlychild].name "onlychild"
+datatype[-205818510].structtype[single].field[onlychild].id[0]
+datatype[-205818510].structtype[single].field[onlyfather].datatype 2
+datatype[-205818510].structtype[single].field[onlyfather].name "onlyfather"
+datatype[-205818510].structtype[single].field[onlyfather].id[0]
+datatype[-205818510].structtype[single].field[onlygrandparent].datatype 0
+datatype[-205818510].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-205818510].structtype[single].field[onlygrandparent].id[0]
+datatype[-205818510].structtype[single].field[onlymother].datatype 2
+datatype[-205818510].structtype[single].field[onlymother].name "onlymother"
+datatype[-205818510].structtype[single].field[onlymother].id[0]
+datatype[-205818510].structtype[single].field[overridden].datatype 0
+datatype[-205818510].structtype[single].field[overridden].name "overridden"
+datatype[-205818510].structtype[single].field[overridden].id[0]
+datatype[-205818510].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-205818510].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-205818510].structtype[single].field[rankfeatures].id[0]
+datatype[-205818510].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-205818510].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-205818510].structtype[single].field[summaryfeatures].id[0]
+datatype[-205818510].structtype[single].inherits[0]
+datatype[-205818510].weightedsettype[0]
+datatype[-384824039].id -384824039
+datatype[-384824039].annotationreftype[0]
+datatype[-384824039].arraytype[0]
+datatype[-384824039].documenttype[0]
+datatype[-384824039].structtype[1]
+datatype[-384824039].structtype[single].name "mother_search.header"
+datatype[-384824039].structtype[single].version 0
+datatype[-384824039].structtype[single].field[5]
+datatype[-384824039].structtype[single].field[onlygrandparent].datatype 0
+datatype[-384824039].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[-384824039].structtype[single].field[onlygrandparent].id[0]
+datatype[-384824039].structtype[single].field[onlymother].datatype 2
+datatype[-384824039].structtype[single].field[onlymother].name "onlymother"
+datatype[-384824039].structtype[single].field[onlymother].id[0]
+datatype[-384824039].structtype[single].field[overridden].datatype 0
+datatype[-384824039].structtype[single].field[overridden].name "overridden"
+datatype[-384824039].structtype[single].field[overridden].id[0]
+datatype[-384824039].structtype[single].field[rankfeatures].datatype 147991900
+datatype[-384824039].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[-384824039].structtype[single].field[rankfeatures].id[0]
+datatype[-384824039].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[-384824039].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[-384824039].structtype[single].field[summaryfeatures].id[0]
+datatype[-384824039].structtype[single].inherits[0]
+datatype[-384824039].weightedsettype[0]
+datatype[-52742073].id -52742073
+datatype[-52742073].annotationreftype[0]
+datatype[-52742073].arraytype[0]
+datatype[-52742073].documenttype[0]
+datatype[-52742073].structtype[1]
+datatype[-52742073].structtype[single].name "father_search.body"
+datatype[-52742073].structtype[single].version 0
+datatype[-52742073].structtype[single].field[0]
+datatype[-52742073].structtype[single].inherits[0]
+datatype[-52742073].weightedsettype[0]
+datatype[-580592339].id -580592339
+datatype[-580592339].annotationreftype[0]
+datatype[-580592339].arraytype[0]
+datatype[-580592339].documenttype[1]
+datatype[-580592339].documenttype[single].bodystruct -1467672569
+datatype[-580592339].documenttype[single].headerstruct -205818510
+datatype[-580592339].documenttype[single].name "child_search"
+datatype[-580592339].documenttype[single].version 0
+datatype[-580592339].documenttype[single].inherits[0]
+datatype[-580592339].structtype[0]
+datatype[-580592339].weightedsettype[0]
+datatype[-876064862].id -876064862
+datatype[-876064862].annotationreftype[0]
+datatype[-876064862].arraytype[0]
+datatype[-876064862].documenttype[0]
+datatype[-876064862].structtype[1]
+datatype[-876064862].structtype[single].name "search_position"
+datatype[-876064862].structtype[single].version 0
+datatype[-876064862].structtype[single].field[2]
+datatype[-876064862].structtype[single].field[x].datatype 0
+datatype[-876064862].structtype[single].field[x].name "x"
+datatype[-876064862].structtype[single].field[x].id[0]
+datatype[-876064862].structtype[single].field[y].datatype 0
+datatype[-876064862].structtype[single].field[y].name "y"
+datatype[-876064862].structtype[single].field[y].id[0]
+datatype[-876064862].structtype[single].inherits[0]
+datatype[-876064862].weightedsettype[0]
+datatype[1306663898].id 1306663898
+datatype[1306663898].annotationreftype[0]
+datatype[1306663898].arraytype[0]
+datatype[1306663898].documenttype[0]
+datatype[1306663898].structtype[1]
+datatype[1306663898].structtype[single].name "mother.header"
+datatype[1306663898].structtype[single].version 0
+datatype[1306663898].structtype[single].field[1]
+datatype[1306663898].structtype[single].field[onlymother].datatype 2
+datatype[1306663898].structtype[single].field[onlymother].name "onlymother"
+datatype[1306663898].structtype[single].field[onlymother].id[0]
+datatype[1306663898].structtype[single].inherits[0]
+datatype[1306663898].weightedsettype[0]
+datatype[1464571117].id 1464571117
+datatype[1464571117].annotationreftype[0]
+datatype[1464571117].arraytype[0]
+datatype[1464571117].documenttype[1]
+datatype[1464571117].documenttype[single].bodystruct -52742073
+datatype[1464571117].documenttype[single].headerstruct -1962244686
+datatype[1464571117].documenttype[single].name "father_search"
+datatype[1464571117].documenttype[single].version 0
+datatype[1464571117].documenttype[single].inherits[0]
+datatype[1464571117].structtype[0]
+datatype[1464571117].weightedsettype[0]
+datatype[147991900].id 147991900
+datatype[147991900].annotationreftype[0]
+datatype[147991900].arraytype[1]
+datatype[147991900].arraytype[single].datatype -1740240543
+datatype[147991900].documenttype[0]
+datatype[147991900].structtype[0]
+datatype[147991900].weightedsettype[0]
+datatype[1530060044].id 1530060044
+datatype[1530060044].annotationreftype[0]
+datatype[1530060044].arraytype[0]
+datatype[1530060044].documenttype[0]
+datatype[1530060044].structtype[1]
+datatype[1530060044].structtype[single].name "grandparent_search.header"
+datatype[1530060044].structtype[single].version 0
+datatype[1530060044].structtype[single].field[4]
+datatype[1530060044].structtype[single].field[onlygrandparent].datatype 0
+datatype[1530060044].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[1530060044].structtype[single].field[onlygrandparent].id[0]
+datatype[1530060044].structtype[single].field[overridden].datatype 0
+datatype[1530060044].structtype[single].field[overridden].name "overridden"
+datatype[1530060044].structtype[single].field[overridden].id[0]
+datatype[1530060044].structtype[single].field[rankfeatures].datatype 147991900
+datatype[1530060044].structtype[single].field[rankfeatures].name "rankfeatures"
+datatype[1530060044].structtype[single].field[rankfeatures].id[0]
+datatype[1530060044].structtype[single].field[summaryfeatures].datatype 147991900
+datatype[1530060044].structtype[single].field[summaryfeatures].name "summaryfeatures"
+datatype[1530060044].structtype[single].field[summaryfeatures].id[0]
+datatype[1530060044].structtype[single].inherits[0]
+datatype[1530060044].weightedsettype[0]
+datatype[1845861921].id 1845861921
+datatype[1845861921].annotationreftype[0]
+datatype[1845861921].arraytype[0]
+datatype[1845861921].documenttype[0]
+datatype[1845861921].structtype[1]
+datatype[1845861921].structtype[single].name "grandparent_search.body"
+datatype[1845861921].structtype[single].version 0
+datatype[1845861921].structtype[single].field[0]
+datatype[1845861921].structtype[single].inherits[0]
+datatype[1845861921].weightedsettype[0]
+datatype[2126589281].id 2126589281
+datatype[2126589281].annotationreftype[0]
+datatype[2126589281].arraytype[0]
+datatype[2126589281].documenttype[0]
+datatype[2126589281].structtype[1]
+datatype[2126589281].structtype[single].name "father.header"
+datatype[2126589281].structtype[single].version 0
+datatype[2126589281].structtype[single].field[1]
+datatype[2126589281].structtype[single].field[onlyfather].datatype 2
+datatype[2126589281].structtype[single].field[onlyfather].name "onlyfather"
+datatype[2126589281].structtype[single].field[onlyfather].id[0]
+datatype[2126589281].structtype[single].inherits[0]
+datatype[2126589281].weightedsettype[0]
+datatype[328953555].id 328953555
+datatype[328953555].annotationreftype[0]
+datatype[328953555].arraytype[0]
+datatype[328953555].documenttype[1]
+datatype[328953555].documenttype[single].bodystruct 1845861921
+datatype[328953555].documenttype[single].headerstruct 1530060044
+datatype[328953555].documenttype[single].name "grandparent_search"
+datatype[328953555].documenttype[single].version 0
+datatype[328953555].documenttype[single].inherits[0]
+datatype[328953555].structtype[0]
+datatype[328953555].weightedsettype[0]
+datatype[464784087].id 464784087
+datatype[464784087].annotationreftype[0]
+datatype[464784087].arraytype[0]
+datatype[464784087].documenttype[0]
+datatype[464784087].structtype[1]
+datatype[464784087].structtype[single].name "search_uri"
+datatype[464784087].structtype[single].version 0
+datatype[464784087].structtype[single].field[7]
+datatype[464784087].structtype[single].field[all].datatype 2
+datatype[464784087].structtype[single].field[all].name "all"
+datatype[464784087].structtype[single].field[all].id[0]
+datatype[464784087].structtype[single].field[fragment].datatype 2
+datatype[464784087].structtype[single].field[fragment].name "fragment"
+datatype[464784087].structtype[single].field[fragment].id[0]
+datatype[464784087].structtype[single].field[host].datatype 2
+datatype[464784087].structtype[single].field[host].name "host"
+datatype[464784087].structtype[single].field[host].id[0]
+datatype[464784087].structtype[single].field[path].datatype 2
+datatype[464784087].structtype[single].field[path].name "path"
+datatype[464784087].structtype[single].field[path].id[0]
+datatype[464784087].structtype[single].field[port].datatype 0
+datatype[464784087].structtype[single].field[port].name "port"
+datatype[464784087].structtype[single].field[port].id[0]
+datatype[464784087].structtype[single].field[query].datatype 2
+datatype[464784087].structtype[single].field[query].name "query"
+datatype[464784087].structtype[single].field[query].id[0]
+datatype[464784087].structtype[single].field[scheme].datatype 2
+datatype[464784087].structtype[single].field[scheme].name "scheme"
+datatype[464784087].structtype[single].field[scheme].id[0]
+datatype[464784087].structtype[single].inherits[0]
+datatype[464784087].weightedsettype[0]
+datatype[644645734].id 644645734
+datatype[644645734].annotationreftype[0]
+datatype[644645734].arraytype[0]
+datatype[644645734].documenttype[1]
+datatype[644645734].documenttype[single].bodystruct -1852215954
+datatype[644645734].documenttype[single].headerstruct -384824039
+datatype[644645734].documenttype[single].name "mother_search"
+datatype[644645734].documenttype[single].version 0
+datatype[644645734].documenttype[single].inherits[0]
+datatype[644645734].structtype[0]
+datatype[644645734].weightedsettype[0]
+datatype[746267614].id 746267614
+datatype[746267614].annotationreftype[0]
+datatype[746267614].arraytype[0]
+datatype[746267614].documenttype[1]
+datatype[746267614].documenttype[single].bodystruct -126593034
+datatype[746267614].documenttype[single].headerstruct 81425825
+datatype[746267614].documenttype[single].name "child"
+datatype[746267614].documenttype[single].version 0
+datatype[746267614].documenttype[single].inherits[2]
+datatype[746267614].documenttype[single].inherits[father].name "father"
+datatype[746267614].documenttype[single].inherits[father].version 0
+datatype[746267614].documenttype[single].inherits[mother].name "mother"
+datatype[746267614].documenttype[single].inherits[mother].version 0
+datatype[746267614].structtype[0]
+datatype[746267614].weightedsettype[0]
+datatype[81425825].id 81425825
+datatype[81425825].annotationreftype[0]
+datatype[81425825].arraytype[0]
+datatype[81425825].documenttype[0]
+datatype[81425825].structtype[1]
+datatype[81425825].structtype[single].name "child.header"
+datatype[81425825].structtype[single].version 0
+datatype[81425825].structtype[single].field[1]
+datatype[81425825].structtype[single].field[onlychild].datatype 2
+datatype[81425825].structtype[single].field[onlychild].name "onlychild"
+datatype[81425825].structtype[single].field[onlychild].id[0]
+datatype[81425825].structtype[single].inherits[0]
+datatype[81425825].weightedsettype[0]
+datatype[978262812].id 978262812
+datatype[978262812].annotationreftype[0]
+datatype[978262812].arraytype[0]
+datatype[978262812].documenttype[0]
+datatype[978262812].structtype[1]
+datatype[978262812].structtype[single].name "grandparent.body"
+datatype[978262812].structtype[single].version 0
+datatype[978262812].structtype[single].field[0]
+datatype[978262812].structtype[single].inherits[0]
+datatype[978262812].weightedsettype[0]
+datatype[986686494].id 986686494
+datatype[986686494].annotationreftype[0]
+datatype[986686494].arraytype[0]
+datatype[986686494].documenttype[1]
+datatype[986686494].documenttype[single].bodystruct -1742340170
+datatype[986686494].documenttype[single].headerstruct 2126589281
+datatype[986686494].documenttype[single].name "father"
+datatype[986686494].documenttype[single].version 0
+datatype[986686494].documenttype[single].inherits[1]
+datatype[986686494].documenttype[single].inherits[grandparent].name "grandparent"
+datatype[986686494].documenttype[single].inherits[grandparent].version 0
+datatype[986686494].structtype[0]
+datatype[986686494].weightedsettype[0]
+datatype[990971719].id 990971719
+datatype[990971719].annotationreftype[0]
+datatype[990971719].arraytype[0]
+datatype[990971719].documenttype[0]
+datatype[990971719].structtype[1]
+datatype[990971719].structtype[single].name "grandparent.header"
+datatype[990971719].structtype[single].version 0
+datatype[990971719].structtype[single].field[2]
+datatype[990971719].structtype[single].field[onlygrandparent].datatype 0
+datatype[990971719].structtype[single].field[onlygrandparent].name "onlygrandparent"
+datatype[990971719].structtype[single].field[onlygrandparent].id[0]
+datatype[990971719].structtype[single].field[overridden].datatype 0
+datatype[990971719].structtype[single].field[overridden].name "overridden"
+datatype[990971719].structtype[single].field[overridden].id[0]
+datatype[990971719].structtype[single].inherits[0]
+datatype[990971719].weightedsettype[0]
diff --git a/config-model/src/test/derived/inheritance/rank-profiles.cfg b/config-model/src/test/derived/inheritance/rank-profiles.cfg
new file mode 100644
index 00000000000..abfea4714d5
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/rank-profiles.cfg
@@ -0,0 +1,16 @@
+rankprofile[2]
+rankprofile[default].name "default"
+rankprofile[default].fef.property[0]
+rankprofile[unranked].binhigh 0
+rankprofile[unranked].binlow 0
+rankprofile[unranked].binsize 0.0
+rankprofile[unranked].name "unranked"
+rankprofile[unranked].fef.property[4]
+rankprofile[unranked].fef.property[a00000].name "vespa.rank.firstphase"
+rankprofile[unranked].fef.property[a00000].value "value(0)"
+rankprofile[unranked].fef.property[a00001].name "vespa.hitcollector.heapsize"
+rankprofile[unranked].fef.property[a00001].value "0"
+rankprofile[unranked].fef.property[a00002].name "vespa.hitcollector.arraysize"
+rankprofile[unranked].fef.property[a00002].value "0"
+rankprofile[unranked].fef.property[a00003].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[unranked].fef.property[a00003].value "true"
diff --git a/config-model/src/test/derived/inheritance/summary.cfg b/config-model/src/test/derived/inheritance/summary.cfg
new file mode 100644
index 00000000000..c396dc780b4
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/summary.cfg
@@ -0,0 +1,26 @@
+defaultsummaryid 1570256615
+classes[2]
+classes[1570256615].id 1570256615
+classes[1570256615].name "child"
+classes[1570256615].fields[4]
+classes[1570256615].fields[documentid].name "documentid"
+classes[1570256615].fields[documentid].type "longstring"
+classes[1570256615].fields[onlyfather].name "onlyfather"
+classes[1570256615].fields[onlyfather].type "longstring"
+classes[1570256615].fields[rankfeatures].name "rankfeatures"
+classes[1570256615].fields[rankfeatures].type "longstring"
+classes[1570256615].fields[summaryfeatures].name "summaryfeatures"
+classes[1570256615].fields[summaryfeatures].type "longstring"
+classes[306313061].id 306313061
+classes[306313061].name "attributeprefetch"
+classes[306313061].fields[5]
+classes[306313061].fields[onlygrandparent].name "onlygrandparent"
+classes[306313061].fields[onlygrandparent].type "integer"
+classes[306313061].fields[onlymother].name "onlymother"
+classes[306313061].fields[onlymother].type "longstring"
+classes[306313061].fields[overridden].name "overridden"
+classes[306313061].fields[overridden].type "integer"
+classes[306313061].fields[rankfeatures].name "rankfeatures"
+classes[306313061].fields[rankfeatures].type "longstring"
+classes[306313061].fields[summaryfeatures].name "summaryfeatures"
+classes[306313061].fields[summaryfeatures].type "longstring"
diff --git a/config-model/src/test/derived/inheritance/summarymap.cfg b/config-model/src/test/derived/inheritance/summarymap.cfg
new file mode 100644
index 00000000000..c92c8e1cf6c
--- /dev/null
+++ b/config-model/src/test/derived/inheritance/summarymap.cfg
@@ -0,0 +1,17 @@
+defaultoutputclass -1
+override[5]
+override[onlygrandparent].arguments "onlygrandparent"
+override[onlygrandparent].command "attribute"
+override[onlygrandparent].field "onlygrandparent"
+override[onlymother].arguments "onlymother"
+override[onlymother].command "attribute"
+override[onlymother].field "onlymother"
+override[overridden].arguments "overridden"
+override[overridden].command "attribute"
+override[overridden].field "overridden"
+override[rankfeatures].arguments ""
+override[rankfeatures].command "rankfeatures"
+override[rankfeatures].field "rankfeatures"
+override[summaryfeatures].arguments ""
+override[summaryfeatures].command "summaryfeatures"
+override[summaryfeatures].field "summaryfeatures"
diff --git a/config-model/src/test/derived/inheritancebadtypes/child.sd b/config-model/src/test/derived/inheritancebadtypes/child.sd
new file mode 100644
index 00000000000..5a3f5b46b24
--- /dev/null
+++ b/config-model/src/test/derived/inheritancebadtypes/child.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+document child inherits parent {
+ field a type int {
+ indexing: index
+ }
+}
+}
diff --git a/config-model/src/test/derived/inheritancebadtypes/parent.sd b/config-model/src/test/derived/inheritancebadtypes/parent.sd
new file mode 100644
index 00000000000..470faf4fec6
--- /dev/null
+++ b/config-model/src/test/derived/inheritancebadtypes/parent.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+document parent {
+ field a type string {
+ indexing: index
+ }
+}
+}
diff --git a/config-model/src/test/derived/inheritdiamond/.gitignore b/config-model/src/test/derived/inheritdiamond/.gitignore
new file mode 100644
index 00000000000..fc6b63d95e9
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/.gitignore
@@ -0,0 +1 @@
+/documentmanager.15.cfg
diff --git a/config-model/src/test/derived/inheritdiamond/child.sd b/config-model/src/test/derived/inheritdiamond/child.sd
new file mode 100644
index 00000000000..795f01edbaa
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/child.sd
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+ document child inherits mother, father {
+ struct child_struct {
+ field child_field type string { }
+ }
+ field foo type grandparent_struct { }
+ field bar type mother_struct { }
+ field baz type father_struct { }
+ field cox type child_struct { }
+ }
+}
diff --git a/config-model/src/test/derived/inheritdiamond/documentmanager.cfg b/config-model/src/test/derived/inheritdiamond/documentmanager.cfg
new file mode 100644
index 00000000000..5f3edfb8475
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/documentmanager.cfg
@@ -0,0 +1,269 @@
+enablecompression false
+datatype[0].id -126593034
+datatype[0].structtype[0].name "child.body"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[1].id 336538650
+datatype[1].structtype[0].name "child_struct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "child_field"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 81425825
+datatype[2].structtype[0].name "child.header"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "foo"
+datatype[2].structtype[0].field[0].datatype 1246084544
+datatype[2].structtype[0].field[1].name "bar"
+datatype[2].structtype[0].field[1].datatype 1561776723
+datatype[2].structtype[0].field[2].name "baz"
+datatype[2].structtype[0].field[2].datatype -1913265190
+datatype[2].structtype[0].field[3].name "cox"
+datatype[2].structtype[0].field[3].datatype 336538650
+datatype[3].id 746267614
+datatype[3].documenttype[0].name "child"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "mother"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].inherits[1].name "document"
+datatype[3].documenttype[0].inherits[1].version 0
+datatype[3].documenttype[0].inherits[2].name "father"
+datatype[3].documenttype[0].inherits[2].version 0
+datatype[3].documenttype[0].headerstruct 81425825
+datatype[3].documenttype[0].bodystruct -126593034
+datatype[4].id -1913265190
+datatype[4].structtype[0].name "father_struct"
+datatype[4].structtype[0].version 0
+datatype[4].structtype[0].compresstype NONE
+datatype[4].structtype[0].compresslevel 0
+datatype[4].structtype[0].compressthreshold 95
+datatype[4].structtype[0].compressminsize 800
+datatype[4].structtype[0].field[0].name "father_field"
+datatype[4].structtype[0].field[0].datatype 2
+datatype[5].id 1246084544
+datatype[5].structtype[0].name "grandparent_struct"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "grandparent_field"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[6].id -1962244686
+datatype[6].structtype[0].name "father_search.header"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[6].structtype[0].field[0].name "rankfeatures"
+datatype[6].structtype[0].field[0].datatype 2
+datatype[6].structtype[0].field[1].name "summaryfeatures"
+datatype[6].structtype[0].field[1].datatype 2
+datatype[7].id -52742073
+datatype[7].structtype[0].name "father_search.body"
+datatype[7].structtype[0].version 0
+datatype[7].structtype[0].compresstype NONE
+datatype[7].structtype[0].compresslevel 0
+datatype[7].structtype[0].compressthreshold 95
+datatype[7].structtype[0].compressminsize 800
+datatype[8].id 1464571117
+datatype[8].documenttype[0].name "father_search"
+datatype[8].documenttype[0].version 0
+datatype[8].documenttype[0].inherits[0].name "document"
+datatype[8].documenttype[0].inherits[0].version 0
+datatype[8].documenttype[0].headerstruct -1962244686
+datatype[8].documenttype[0].bodystruct -52742073
+datatype[9].id -1852215954
+datatype[9].structtype[0].name "mother_search.body"
+datatype[9].structtype[0].version 0
+datatype[9].structtype[0].compresstype NONE
+datatype[9].structtype[0].compresslevel 0
+datatype[9].structtype[0].compressthreshold 95
+datatype[9].structtype[0].compressminsize 800
+datatype[10].id -384824039
+datatype[10].structtype[0].name "mother_search.header"
+datatype[10].structtype[0].version 0
+datatype[10].structtype[0].compresstype NONE
+datatype[10].structtype[0].compresslevel 0
+datatype[10].structtype[0].compressthreshold 95
+datatype[10].structtype[0].compressminsize 800
+datatype[10].structtype[0].field[0].name "rankfeatures"
+datatype[10].structtype[0].field[0].datatype 2
+datatype[10].structtype[0].field[1].name "summaryfeatures"
+datatype[10].structtype[0].field[1].datatype 2
+datatype[11].id 1561776723
+datatype[11].structtype[0].name "mother_struct"
+datatype[11].structtype[0].version 0
+datatype[11].structtype[0].compresstype NONE
+datatype[11].structtype[0].compresslevel 0
+datatype[11].structtype[0].compressthreshold 95
+datatype[11].structtype[0].compressminsize 800
+datatype[11].structtype[0].field[0].name "mother_field"
+datatype[11].structtype[0].field[0].datatype 2
+datatype[12].id 644645734
+datatype[12].documenttype[0].name "mother_search"
+datatype[12].documenttype[0].version 0
+datatype[12].documenttype[0].inherits[0].name "document"
+datatype[12].documenttype[0].inherits[0].version 0
+datatype[12].documenttype[0].headerstruct -384824039
+datatype[12].documenttype[0].bodystruct -1852215954
+datatype[13].id 1306663898
+datatype[13].structtype[0].name "mother.header"
+datatype[13].structtype[0].version 0
+datatype[13].structtype[0].compresstype NONE
+datatype[13].structtype[0].compresslevel 0
+datatype[13].structtype[0].compressthreshold 95
+datatype[13].structtype[0].compressminsize 800
+datatype[14].id -1989003153
+datatype[14].structtype[0].name "mother.body"
+datatype[14].structtype[0].version 0
+datatype[14].structtype[0].compresstype NONE
+datatype[14].structtype[0].compresslevel 0
+datatype[14].structtype[0].compressthreshold 95
+datatype[14].structtype[0].compressminsize 800
+datatype[15].id -158393403
+datatype[15].documenttype[0].name "mother"
+datatype[15].documenttype[0].version 0
+datatype[15].documenttype[0].inherits[0].name "grandparent"
+datatype[15].documenttype[0].inherits[0].version 0
+datatype[15].documenttype[0].inherits[1].name "document"
+datatype[15].documenttype[0].inherits[1].version 0
+datatype[15].documenttype[0].headerstruct 1306663898
+datatype[15].documenttype[0].bodystruct -1989003153
+datatype[16].id -205818510
+datatype[16].structtype[0].name "child_search.header"
+datatype[16].structtype[0].version 0
+datatype[16].structtype[0].compresstype NONE
+datatype[16].structtype[0].compresslevel 0
+datatype[16].structtype[0].compressthreshold 95
+datatype[16].structtype[0].compressminsize 800
+datatype[16].structtype[0].field[0].name "rankfeatures"
+datatype[16].structtype[0].field[0].datatype 2
+datatype[16].structtype[0].field[1].name "summaryfeatures"
+datatype[16].structtype[0].field[1].datatype 2
+datatype[17].id -1467672569
+datatype[17].structtype[0].name "child_search.body"
+datatype[17].structtype[0].version 0
+datatype[17].structtype[0].compresstype NONE
+datatype[17].structtype[0].compresslevel 0
+datatype[17].structtype[0].compressthreshold 95
+datatype[17].structtype[0].compressminsize 800
+datatype[18].id -580592339
+datatype[18].documenttype[0].name "child_search"
+datatype[18].documenttype[0].version 0
+datatype[18].documenttype[0].inherits[0].name "document"
+datatype[18].documenttype[0].inherits[0].version 0
+datatype[18].documenttype[0].headerstruct -205818510
+datatype[18].documenttype[0].bodystruct -1467672569
+datatype[19].id 111553393
+datatype[19].structtype[0].name "url"
+datatype[19].structtype[0].version 0
+datatype[19].structtype[0].compresstype NONE
+datatype[19].structtype[0].compresslevel 0
+datatype[19].structtype[0].compressthreshold 95
+datatype[19].structtype[0].compressminsize 800
+datatype[19].structtype[0].field[0].name "all"
+datatype[19].structtype[0].field[0].datatype 2
+datatype[19].structtype[0].field[1].name "scheme"
+datatype[19].structtype[0].field[1].datatype 2
+datatype[19].structtype[0].field[2].name "host"
+datatype[19].structtype[0].field[2].datatype 2
+datatype[19].structtype[0].field[3].name "port"
+datatype[19].structtype[0].field[3].datatype 2
+datatype[19].structtype[0].field[4].name "path"
+datatype[19].structtype[0].field[4].datatype 2
+datatype[19].structtype[0].field[5].name "query"
+datatype[19].structtype[0].field[5].datatype 2
+datatype[19].structtype[0].field[6].name "fragment"
+datatype[19].structtype[0].field[6].datatype 2
+datatype[20].id 1381038251
+datatype[20].structtype[0].name "position"
+datatype[20].structtype[0].version 0
+datatype[20].structtype[0].compresstype NONE
+datatype[20].structtype[0].compresslevel 0
+datatype[20].structtype[0].compressthreshold 95
+datatype[20].structtype[0].compressminsize 800
+datatype[20].structtype[0].field[0].name "x"
+datatype[20].structtype[0].field[0].datatype 0
+datatype[20].structtype[0].field[1].name "y"
+datatype[20].structtype[0].field[1].datatype 0
+datatype[21].id 1845861921
+datatype[21].structtype[0].name "grandparent_search.body"
+datatype[21].structtype[0].version 0
+datatype[21].structtype[0].compresstype NONE
+datatype[21].structtype[0].compresslevel 0
+datatype[21].structtype[0].compressthreshold 95
+datatype[21].structtype[0].compressminsize 800
+datatype[22].id 1530060044
+datatype[22].structtype[0].name "grandparent_search.header"
+datatype[22].structtype[0].version 0
+datatype[22].structtype[0].compresstype NONE
+datatype[22].structtype[0].compresslevel 0
+datatype[22].structtype[0].compressthreshold 95
+datatype[22].structtype[0].compressminsize 800
+datatype[22].structtype[0].field[0].name "rankfeatures"
+datatype[22].structtype[0].field[0].datatype 2
+datatype[22].structtype[0].field[1].name "summaryfeatures"
+datatype[22].structtype[0].field[1].datatype 2
+datatype[23].id 328953555
+datatype[23].documenttype[0].name "grandparent_search"
+datatype[23].documenttype[0].version 0
+datatype[23].documenttype[0].inherits[0].name "document"
+datatype[23].documenttype[0].inherits[0].version 0
+datatype[23].documenttype[0].headerstruct 1530060044
+datatype[23].documenttype[0].bodystruct 1845861921
+datatype[24].id 990971719
+datatype[24].structtype[0].name "grandparent.header"
+datatype[24].structtype[0].version 0
+datatype[24].structtype[0].compresstype NONE
+datatype[24].structtype[0].compresslevel 0
+datatype[24].structtype[0].compressthreshold 95
+datatype[24].structtype[0].compressminsize 800
+datatype[25].id 978262812
+datatype[25].structtype[0].name "grandparent.body"
+datatype[25].structtype[0].version 0
+datatype[25].structtype[0].compresstype NONE
+datatype[25].structtype[0].compresslevel 0
+datatype[25].structtype[0].compressthreshold 95
+datatype[25].structtype[0].compressminsize 800
+datatype[26].id -154107656
+datatype[26].documenttype[0].name "grandparent"
+datatype[26].documenttype[0].version 0
+datatype[26].documenttype[0].inherits[0].name "document"
+datatype[26].documenttype[0].inherits[0].version 0
+datatype[26].documenttype[0].headerstruct 990971719
+datatype[26].documenttype[0].bodystruct 978262812
+datatype[27].id -1742340170
+datatype[27].structtype[0].name "father.body"
+datatype[27].structtype[0].version 0
+datatype[27].structtype[0].compresstype NONE
+datatype[27].structtype[0].compresslevel 0
+datatype[27].structtype[0].compressthreshold 95
+datatype[27].structtype[0].compressminsize 800
+datatype[28].id 2126589281
+datatype[28].structtype[0].name "father.header"
+datatype[28].structtype[0].version 0
+datatype[28].structtype[0].compresstype NONE
+datatype[28].structtype[0].compresslevel 0
+datatype[28].structtype[0].compressthreshold 95
+datatype[28].structtype[0].compressminsize 800
+datatype[29].id 986686494
+datatype[29].documenttype[0].name "father"
+datatype[29].documenttype[0].version 0
+datatype[29].documenttype[0].inherits[0].name "grandparent"
+datatype[29].documenttype[0].inherits[0].version 0
+datatype[29].documenttype[0].inherits[1].name "document"
+datatype[29].documenttype[0].inherits[1].version 0
+datatype[29].documenttype[0].headerstruct 2126589281
+datatype[29].documenttype[0].bodystruct -1742340170
diff --git a/config-model/src/test/derived/inheritdiamond/father.sd b/config-model/src/test/derived/inheritdiamond/father.sd
new file mode 100644
index 00000000000..59bd145cf5a
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/father.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search father {
+ document father inherits grandparent {
+ struct father_struct {
+ field father_field type string { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritdiamond/grandparent.sd b/config-model/src/test/derived/inheritdiamond/grandparent.sd
new file mode 100644
index 00000000000..2944c0f32cc
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/grandparent.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search grandparent {
+ document grandparent {
+ struct grandparent_struct {
+ field grandparent_field type string { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritdiamond/mother.sd b/config-model/src/test/derived/inheritdiamond/mother.sd
new file mode 100644
index 00000000000..cd5fa8cae4d
--- /dev/null
+++ b/config-model/src/test/derived/inheritdiamond/mother.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search mother {
+ document mother inherits grandparent {
+ struct mother_struct {
+ field mother_field type string { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromgrandparent/child.sd b/config-model/src/test/derived/inheritfromgrandparent/child.sd
new file mode 100644
index 00000000000..891a92323b1
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromgrandparent/child.sd
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+ document child inherits parent {
+ field child_field type grandparent_struct { }
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg b/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg
new file mode 100644
index 00000000000..8c51dc52c58
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromgrandparent/documentmanager.cfg
@@ -0,0 +1,99 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1246084544
+datatype[1].structtype[0].name "grandparent_struct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "grandparent_field"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 990971719
+datatype[2].structtype[0].name "grandparent.header"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "rankfeatures"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "summaryfeatures"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[3].id 978262812
+datatype[3].structtype[0].name "grandparent.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[4].id -154107656
+datatype[4].documenttype[0].name "grandparent"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct 990971719
+datatype[4].documenttype[0].bodystruct 978262812
+datatype[5].id 836075987
+datatype[5].structtype[0].name "parent.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[6].id -389494616
+datatype[6].structtype[0].name "parent.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id 1175161836
+datatype[7].documenttype[0].name "parent"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "grandparent"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].inherits[1].name "document"
+datatype[7].documenttype[0].inherits[1].version 0
+datatype[7].documenttype[0].headerstruct 836075987
+datatype[7].documenttype[0].bodystruct -389494616
+datatype[7].documenttype[0].fieldsets{[document]}.fields[0] "rankfeatures"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[1] "summaryfeatures"
+datatype[8].id 81425825
+datatype[8].structtype[0].name "child.header"
+datatype[8].structtype[0].version 0
+datatype[8].structtype[0].compresstype NONE
+datatype[8].structtype[0].compresslevel 0
+datatype[8].structtype[0].compressthreshold 95
+datatype[8].structtype[0].compressminsize 800
+datatype[8].structtype[0].field[0].name "child_field"
+datatype[8].structtype[0].field[0].datatype 1246084544
+datatype[9].id -126593034
+datatype[9].structtype[0].name "child.body"
+datatype[9].structtype[0].version 0
+datatype[9].structtype[0].compresstype NONE
+datatype[9].structtype[0].compresslevel 0
+datatype[9].structtype[0].compressthreshold 95
+datatype[9].structtype[0].compressminsize 800
+datatype[10].id 746267614
+datatype[10].documenttype[0].name "child"
+datatype[10].documenttype[0].version 0
+datatype[10].documenttype[0].inherits[0].name "document"
+datatype[10].documenttype[0].inherits[0].version 0
+datatype[10].documenttype[0].inherits[1].name "parent"
+datatype[10].documenttype[0].inherits[1].version 0
+datatype[10].documenttype[0].headerstruct 81425825
+datatype[10].documenttype[0].bodystruct -126593034
+datatype[10].documenttype[0].fieldsets{[document]}.fields[0] "child_field"
+datatype[10].documenttype[0].fieldsets{[document]}.fields[1] "rankfeatures"
+datatype[10].documenttype[0].fieldsets{[document]}.fields[2] "summaryfeatures"
diff --git a/config-model/src/test/derived/inheritfromgrandparent/grandparent.sd b/config-model/src/test/derived/inheritfromgrandparent/grandparent.sd
new file mode 100644
index 00000000000..2944c0f32cc
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromgrandparent/grandparent.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search grandparent {
+ document grandparent {
+ struct grandparent_struct {
+ field grandparent_field type string { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromgrandparent/parent.sd b/config-model/src/test/derived/inheritfromgrandparent/parent.sd
new file mode 100644
index 00000000000..626d0c95657
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromgrandparent/parent.sd
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+ document parent inherits grandparent {
+
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromnull/inheritfromnull.sd b/config-model/src/test/derived/inheritfromnull/inheritfromnull.sd
new file mode 100644
index 00000000000..bac40a07284
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromnull/inheritfromnull.sd
@@ -0,0 +1,5 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search inheritfromnull {
+ document inheritfromnull inherits foo {
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromparent/attributes.cfg b/config-model/src/test/derived/inheritfromparent/attributes.cfg
new file mode 100644
index 00000000000..a5e912fb984
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/attributes.cfg
@@ -0,0 +1,19 @@
+attribute[0].name "weight"
+attribute[0].datatype FLOAT
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/inheritfromparent/child.sd b/config-model/src/test/derived/inheritfromparent/child.sd
new file mode 100644
index 00000000000..5c0242c9acc
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/child.sd
@@ -0,0 +1,6 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+ document child inherits parent {
+ field child_field type parent_struct { }
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromparent/documentmanager.cfg b/config-model/src/test/derived/inheritfromparent/documentmanager.cfg
new file mode 100644
index 00000000000..fec59f5ff72
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/documentmanager.cfg
@@ -0,0 +1,81 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 1091188812
+datatype[1].structtype[0].name "parent_struct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "parent_field"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[2].id 836075987
+datatype[2].structtype[0].name "parent.header"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "weight_src"
+datatype[2].structtype[0].field[0].datatype 1
+datatype[2].structtype[0].field[1].name "weight"
+datatype[2].structtype[0].field[1].datatype 1
+datatype[2].structtype[0].field[2].name "rankfeatures"
+datatype[2].structtype[0].field[2].datatype 2
+datatype[2].structtype[0].field[3].name "summaryfeatures"
+datatype[2].structtype[0].field[3].datatype 2
+datatype[3].id -389494616
+datatype[3].structtype[0].name "parent.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[4].id 1175161836
+datatype[4].documenttype[0].name "parent"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct 836075987
+datatype[4].documenttype[0].bodystruct -389494616
+datatype[4].documenttype[0].fieldsets{[document]}.fields[0] "weight_src"
+datatype[5].id 81425825
+datatype[5].structtype[0].name "child.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "child_field"
+datatype[5].structtype[0].field[0].datatype 1091188812
+datatype[6].id -126593034
+datatype[6].structtype[0].name "child.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id 746267614
+datatype[7].documenttype[0].name "child"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].inherits[1].name "parent"
+datatype[7].documenttype[0].inherits[1].version 0
+datatype[7].documenttype[0].headerstruct 81425825
+datatype[7].documenttype[0].bodystruct -126593034
+datatype[7].documenttype[0].fieldsets{[document]}.fields[0] "child_field"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[1] "rankfeatures"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[2] "summaryfeatures"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[3] "weight"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[4] "weight_src"
diff --git a/config-model/src/test/derived/inheritfromparent/documenttypes.cfg b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
new file mode 100644
index 00000000000..44677776f3c
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/documenttypes.cfg
@@ -0,0 +1,119 @@
+enablecompression false
+documenttype[0].id 1175161836
+documenttype[0].name "parent"
+documenttype[0].version 0
+documenttype[0].headerstruct 836075987
+documenttype[0].bodystruct -389494616
+documenttype[0].inherits[0].id 8
+documenttype[0].datatype[0].id 1091188812
+documenttype[0].datatype[0].type STRUCT
+documenttype[0].datatype[0].array.element.id 0
+documenttype[0].datatype[0].map.key.id 0
+documenttype[0].datatype[0].map.value.id 0
+documenttype[0].datatype[0].wset.key.id 0
+documenttype[0].datatype[0].wset.createifnonexistent false
+documenttype[0].datatype[0].wset.removeifzero false
+documenttype[0].datatype[0].annotationref.annotation.id 0
+documenttype[0].datatype[0].sstruct.name "parent_struct"
+documenttype[0].datatype[0].sstruct.version 0
+documenttype[0].datatype[0].sstruct.compression.type NONE
+documenttype[0].datatype[0].sstruct.compression.level 0
+documenttype[0].datatype[0].sstruct.compression.threshold 95
+documenttype[0].datatype[0].sstruct.compression.minsize 200
+documenttype[0].datatype[0].sstruct.field[0].name "parent_field"
+documenttype[0].datatype[0].sstruct.field[0].id 933533022
+documenttype[0].datatype[0].sstruct.field[0].id_v6 2116869443
+documenttype[0].datatype[0].sstruct.field[0].datatype 2
+documenttype[0].datatype[1].id 836075987
+documenttype[0].datatype[1].type STRUCT
+documenttype[0].datatype[1].array.element.id 0
+documenttype[0].datatype[1].map.key.id 0
+documenttype[0].datatype[1].map.value.id 0
+documenttype[0].datatype[1].wset.key.id 0
+documenttype[0].datatype[1].wset.createifnonexistent false
+documenttype[0].datatype[1].wset.removeifzero false
+documenttype[0].datatype[1].annotationref.annotation.id 0
+documenttype[0].datatype[1].sstruct.name "parent.header"
+documenttype[0].datatype[1].sstruct.version 0
+documenttype[0].datatype[1].sstruct.compression.type NONE
+documenttype[0].datatype[1].sstruct.compression.level 0
+documenttype[0].datatype[1].sstruct.compression.threshold 95
+documenttype[0].datatype[1].sstruct.compression.minsize 200
+documenttype[0].datatype[1].sstruct.field[0].name "weight_src"
+documenttype[0].datatype[1].sstruct.field[0].id 1225660233
+documenttype[0].datatype[1].sstruct.field[0].id_v6 1350588470
+documenttype[0].datatype[1].sstruct.field[0].datatype 1
+documenttype[0].datatype[1].sstruct.field[1].name "weight"
+documenttype[0].datatype[1].sstruct.field[1].id 1001392207
+documenttype[0].datatype[1].sstruct.field[1].id_v6 1329620545
+documenttype[0].datatype[1].sstruct.field[1].datatype 1
+documenttype[0].datatype[1].sstruct.field[2].name "rankfeatures"
+documenttype[0].datatype[1].sstruct.field[2].id 1883197392
+documenttype[0].datatype[1].sstruct.field[2].id_v6 699950698
+documenttype[0].datatype[1].sstruct.field[2].datatype 2
+documenttype[0].datatype[1].sstruct.field[3].name "summaryfeatures"
+documenttype[0].datatype[1].sstruct.field[3].id 1840337115
+documenttype[0].datatype[1].sstruct.field[3].id_v6 1981648971
+documenttype[0].datatype[1].sstruct.field[3].datatype 2
+documenttype[0].datatype[2].id -389494616
+documenttype[0].datatype[2].type STRUCT
+documenttype[0].datatype[2].array.element.id 0
+documenttype[0].datatype[2].map.key.id 0
+documenttype[0].datatype[2].map.value.id 0
+documenttype[0].datatype[2].wset.key.id 0
+documenttype[0].datatype[2].wset.createifnonexistent false
+documenttype[0].datatype[2].wset.removeifzero false
+documenttype[0].datatype[2].annotationref.annotation.id 0
+documenttype[0].datatype[2].sstruct.name "parent.body"
+documenttype[0].datatype[2].sstruct.version 0
+documenttype[0].datatype[2].sstruct.compression.type NONE
+documenttype[0].datatype[2].sstruct.compression.level 0
+documenttype[0].datatype[2].sstruct.compression.threshold 95
+documenttype[0].datatype[2].sstruct.compression.minsize 200
+documenttype[0].fieldsets{[document]}.fields[0] "weight_src"
+documenttype[1].id 746267614
+documenttype[1].name "child"
+documenttype[1].version 0
+documenttype[1].headerstruct 81425825
+documenttype[1].bodystruct -126593034
+documenttype[1].inherits[0].id 8
+documenttype[1].inherits[1].id 1175161836
+documenttype[1].datatype[0].id 81425825
+documenttype[1].datatype[0].type STRUCT
+documenttype[1].datatype[0].array.element.id 0
+documenttype[1].datatype[0].map.key.id 0
+documenttype[1].datatype[0].map.value.id 0
+documenttype[1].datatype[0].wset.key.id 0
+documenttype[1].datatype[0].wset.createifnonexistent false
+documenttype[1].datatype[0].wset.removeifzero false
+documenttype[1].datatype[0].annotationref.annotation.id 0
+documenttype[1].datatype[0].sstruct.name "child.header"
+documenttype[1].datatype[0].sstruct.version 0
+documenttype[1].datatype[0].sstruct.compression.type NONE
+documenttype[1].datatype[0].sstruct.compression.level 0
+documenttype[1].datatype[0].sstruct.compression.threshold 95
+documenttype[1].datatype[0].sstruct.compression.minsize 200
+documenttype[1].datatype[0].sstruct.field[0].name "child_field"
+documenttype[1].datatype[0].sstruct.field[0].id 1814271363
+documenttype[1].datatype[0].sstruct.field[0].id_v6 405182398
+documenttype[1].datatype[0].sstruct.field[0].datatype 1091188812
+documenttype[1].datatype[1].id -126593034
+documenttype[1].datatype[1].type STRUCT
+documenttype[1].datatype[1].array.element.id 0
+documenttype[1].datatype[1].map.key.id 0
+documenttype[1].datatype[1].map.value.id 0
+documenttype[1].datatype[1].wset.key.id 0
+documenttype[1].datatype[1].wset.createifnonexistent false
+documenttype[1].datatype[1].wset.removeifzero false
+documenttype[1].datatype[1].annotationref.annotation.id 0
+documenttype[1].datatype[1].sstruct.name "child.body"
+documenttype[1].datatype[1].sstruct.version 0
+documenttype[1].datatype[1].sstruct.compression.type NONE
+documenttype[1].datatype[1].sstruct.compression.level 0
+documenttype[1].datatype[1].sstruct.compression.threshold 95
+documenttype[1].datatype[1].sstruct.compression.minsize 200
+documenttype[1].fieldsets{[document]}.fields[0] "child_field"
+documenttype[1].fieldsets{[document]}.fields[1] "rankfeatures"
+documenttype[1].fieldsets{[document]}.fields[2] "summaryfeatures"
+documenttype[1].fieldsets{[document]}.fields[3] "weight"
+documenttype[1].fieldsets{[document]}.fields[4] "weight_src"
diff --git a/config-model/src/test/derived/inheritfromparent/parent.sd b/config-model/src/test/derived/inheritfromparent/parent.sd
new file mode 100644
index 00000000000..d9b0f206109
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/parent.sd
@@ -0,0 +1,17 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+ document parent {
+ struct parent_struct {
+ field parent_field type string { }
+ }
+
+ field weight_src type float {
+ }
+ }
+
+ field weight type float {
+ indexing {
+ input weight_src * 10 | attribute | summary;
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritfromparent/summarymap.cfg b/config-model/src/test/derived/inheritfromparent/summarymap.cfg
new file mode 100644
index 00000000000..1ab79191ebd
--- /dev/null
+++ b/config-model/src/test/derived/inheritfromparent/summarymap.cfg
@@ -0,0 +1,10 @@
+defaultoutputclass -1
+override[0].field "weight"
+override[0].command "attribute"
+override[0].arguments "weight"
+override[1].field "rankfeatures"
+override[1].command "rankfeatures"
+override[1].arguments ""
+override[2].field "summaryfeatures"
+override[2].command "summaryfeatures"
+override[2].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/inheritstruct/child.sd b/config-model/src/test/derived/inheritstruct/child.sd
new file mode 100644
index 00000000000..05f65edd2ca
--- /dev/null
+++ b/config-model/src/test/derived/inheritstruct/child.sd
@@ -0,0 +1,10 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search child {
+ document child inherits parent {
+ field child_struct_field type my_struct {
+ indexing: summary | index
+ header
+ match: prefix
+ }
+ }
+}
diff --git a/config-model/src/test/derived/inheritstruct/index-info.cfg b/config-model/src/test/derived/inheritstruct/index-info.cfg
new file mode 100644
index 00000000000..ba9f3eead26
--- /dev/null
+++ b/config-model/src/test/derived/inheritstruct/index-info.cfg
@@ -0,0 +1,21 @@
+indexinfo[0].name "child"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "child_struct_field.my_str"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "child_struct_field.my_str"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "child_struct_field.my_str"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "child_struct_field.my_str"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "child_struct_field"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "child_struct_field"
+indexinfo[0].command[7].command "lowercase"
+indexinfo[0].command[8].indexname "rankfeatures"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "summaryfeatures"
+indexinfo[0].command[9].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/inheritstruct/parent.sd b/config-model/src/test/derived/inheritstruct/parent.sd
new file mode 100644
index 00000000000..311d039cdb0
--- /dev/null
+++ b/config-model/src/test/derived/inheritstruct/parent.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search parent {
+ document parent {
+ struct my_struct {
+ field my_str type string { }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/integerattributetostringindex/integerattributetostringindex.sd b/config-model/src/test/derived/integerattributetostringindex/integerattributetostringindex.sd
new file mode 100644
index 00000000000..ecca60fd98b
--- /dev/null
+++ b/config-model/src/test/derived/integerattributetostringindex/integerattributetostringindex.sd
@@ -0,0 +1,28 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search integerattributetostringindex {
+ document integerattributetostringindex {
+ field attinx type int {
+ indexing: summary | attribute | index
+ # index-to: attinx,default
+ }
+
+field artist type string {
+indexing: summary | attribute
+# index-to: artist, default
+}
+
+
+field title type string {
+indexing: summary | index
+# index-to: title, default
+}
+
+field year type int {
+indexing: summary | attribute
+# index-to:default
+attribute : fast-search
+}
+
+}
+
+}
diff --git a/config-model/src/test/derived/integerattributetostringindex/summary.cfg b/config-model/src/test/derived/integerattributetostringindex/summary.cfg
new file mode 100644
index 00000000000..87567ceb348
--- /dev/null
+++ b/config-model/src/test/derived/integerattributetostringindex/summary.cfg
@@ -0,0 +1,29 @@
+defaultsummaryid 1195656216
+classes[0].id 1195656216
+classes[0].name "default"
+classes[0].fields[0].name "attinx"
+classes[0].fields[0].type "integer"
+classes[0].fields[1].name "artist"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "title"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "year"
+classes[0].fields[3].type "integer"
+classes[0].fields[4].name "rankfeatures"
+classes[0].fields[4].type "featuredata"
+classes[0].fields[5].name "summaryfeatures"
+classes[0].fields[5].type "featuredata"
+classes[0].fields[6].name "documentid"
+classes[0].fields[6].type "longstring"
+classes[1].id 1706878063
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "attinx"
+classes[1].fields[0].type "integer"
+classes[1].fields[1].name "artist"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "year"
+classes[1].fields[2].type "integer"
+classes[1].fields[3].name "rankfeatures"
+classes[1].fields[3].type "featuredata"
+classes[1].fields[4].name "summaryfeatures"
+classes[1].fields[4].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/attributes.cfg b/config-model/src/test/derived/mail/attributes.cfg
new file mode 100644
index 00000000000..fe6c08cf36d
--- /dev/null
+++ b/config-model/src/test/derived/mail/attributes.cfg
@@ -0,0 +1,40 @@
+attribute[0].name "date"
+attribute[0].datatype INT32
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].loadtype ALWAYS
+attribute[0].sparse false
+attribute[0].noupdate false
+attribute[0].fastsearch false
+attribute[0].fastaggregate false
+attribute[0].huge false
+attribute[0].nosummary false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[1].name "attachmentcount"
+attribute[1].datatype INT32
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].loadtype ALWAYS
+attribute[1].sparse false
+attribute[1].noupdate false
+attribute[1].fastsearch false
+attribute[1].fastaggregate false
+attribute[1].huge false
+attribute[1].nosummary false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8 \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/documentmanager.cfg b/config-model/src/test/derived/mail/documentmanager.cfg
new file mode 100644
index 00000000000..c1d92402ee7
--- /dev/null
+++ b/config-model/src/test/derived/mail/documentmanager.cfg
@@ -0,0 +1,115 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -88808602
+datatype[1].structtype[0].name "mail.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "URI"
+datatype[1].structtype[0].field[0].datatype 10
+datatype[1].structtype[0].field[1].name "mailid"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "date"
+datatype[1].structtype[0].field[2].datatype 0
+datatype[1].structtype[0].field[3].name "from"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[4].name "replyto"
+datatype[1].structtype[0].field[4].datatype 12
+datatype[1].structtype[0].field[5].name "to"
+datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[6].name "cc"
+datatype[1].structtype[0].field[6].datatype 2
+datatype[1].structtype[0].field[7].name "bcc"
+datatype[1].structtype[0].field[7].datatype 2
+datatype[1].structtype[0].field[8].name "subject"
+datatype[1].structtype[0].field[8].datatype 2
+datatype[1].structtype[0].field[9].name "snippet"
+datatype[1].structtype[0].field[9].datatype 2
+datatype[1].structtype[0].field[10].name "rankfeatures"
+datatype[1].structtype[0].field[10].datatype 2
+datatype[1].structtype[0].field[11].name "summaryfeatures"
+datatype[1].structtype[0].field[11].datatype 2
+datatype[2].id -1206550296
+datatype[2].arraytype[0].datatype 12
+datatype[3].id -953584901
+datatype[3].structtype[0].name "mail.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "body"
+datatype[3].structtype[0].field[0].datatype 12
+datatype[3].structtype[0].field[1].name "attachmentcount"
+datatype[3].structtype[0].field[1].datatype 0
+datatype[3].structtype[0].field[2].name "attachmentnames"
+datatype[3].structtype[0].field[2].datatype 2
+datatype[3].structtype[0].field[3].name "attachmenttypes"
+datatype[3].structtype[0].field[3].datatype 2
+datatype[3].structtype[0].field[4].name "attachmentlanguages"
+datatype[3].structtype[0].field[4].datatype 2
+datatype[3].structtype[0].field[5].name "attachmentcontent"
+datatype[3].structtype[0].field[5].datatype 2
+datatype[3].structtype[0].field[6].name "attachments"
+datatype[3].structtype[0].field[6].datatype -1206550296
+datatype[4].id -1081574983
+datatype[4].documenttype[0].name "mail"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct -88808602
+datatype[4].documenttype[0].bodystruct -953584901
+datatype[4].documenttype[0].fieldsets{sender}.fields[0] "from"
+datatype[4].documenttype[0].fieldsets{address}.fields[0] "cc"
+datatype[4].documenttype[0].fieldsets{address}.fields[1] "from"
+datatype[4].documenttype[0].fieldsets{address}.fields[2] "to"
+datatype[4].documenttype[0].fieldsets{header}.fields[0] "cc"
+datatype[4].documenttype[0].fieldsets{header}.fields[1] "from"
+datatype[4].documenttype[0].fieldsets{header}.fields[2] "subject"
+datatype[4].documenttype[0].fieldsets{header}.fields[3] "to"
+datatype[4].documenttype[0].fieldsets{default}.fields[0] "body"
+datatype[4].documenttype[0].fieldsets{default}.fields[1] "cc"
+datatype[4].documenttype[0].fieldsets{default}.fields[2] "from"
+datatype[4].documenttype[0].fieldsets{default}.fields[3] "subject"
+datatype[4].documenttype[0].fieldsets{default}.fields[4] "to"
+datatype[4].documenttype[0].fieldsets{all}.fields[0] "attachmentcontent"
+datatype[4].documenttype[0].fieldsets{all}.fields[1] "attachmentnames"
+datatype[4].documenttype[0].fieldsets{all}.fields[2] "attachmenttypes"
+datatype[4].documenttype[0].fieldsets{all}.fields[3] "body"
+datatype[4].documenttype[0].fieldsets{all}.fields[4] "cc"
+datatype[4].documenttype[0].fieldsets{all}.fields[5] "from"
+datatype[4].documenttype[0].fieldsets{all}.fields[6] "subject"
+datatype[4].documenttype[0].fieldsets{all}.fields[7] "to"
+datatype[4].documenttype[0].fieldsets{recipient}.fields[0] "cc"
+datatype[4].documenttype[0].fieldsets{recipient}.fields[1] "to"
+datatype[4].documenttype[0].fieldsets{attachmentname}.fields[0] "attachmentnames"
+datatype[4].documenttype[0].fieldsets{attachmenttype}.fields[0] "attachmenttypes"
+datatype[4].documenttype[0].fieldsets{attachment}.fields[0] "attachmentcontent"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[0] "URI"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[1] "attachmentcontent"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[2] "attachmentcount"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[3] "attachmentlanguages"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[4] "attachmentnames"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[5] "attachments"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[6] "attachmenttypes"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[7] "bcc"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[8] "body"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[9] "cc"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[10] "date"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[11] "from"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[12] "mailid"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[13] "replyto"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[14] "subject"
+datatype[4].documenttype[0].fieldsets{[document]}.fields[15] "to"
diff --git a/config-model/src/test/derived/mail/ilscripts.cfg b/config-model/src/test/derived/mail/ilscripts.cfg
new file mode 100644
index 00000000000..effc8d998b5
--- /dev/null
+++ b/config-model/src/test/derived/mail/ilscripts.cfg
@@ -0,0 +1,33 @@
+ilscript[0].doctype "mail"
+ilscript[0].docfield[0] "URI"
+ilscript[0].docfield[1] "mailid"
+ilscript[0].docfield[2] "date"
+ilscript[0].docfield[3] "from"
+ilscript[0].docfield[4] "replyto"
+ilscript[0].docfield[5] "to"
+ilscript[0].docfield[6] "cc"
+ilscript[0].docfield[7] "bcc"
+ilscript[0].docfield[8] "subject"
+ilscript[0].docfield[9] "body"
+ilscript[0].docfield[10] "attachmentcount"
+ilscript[0].docfield[11] "attachmentnames"
+ilscript[0].docfield[12] "attachmenttypes"
+ilscript[0].docfield[13] "attachmentlanguages"
+ilscript[0].docfield[14] "attachmentcontent"
+ilscript[0].docfield[15] "attachments"
+ilscript[0].content[0] "clear_state | guard { (input body | to_string) . (input attachmentcontent | to_string) | tokenize normalize | summary snippet; }"
+ilscript[0].content[1] "clear_state | guard { input URI | summary URI; }"
+ilscript[0].content[2] "clear_state | guard { input mailid | tokenize normalize | summary mailid | index mailid; }"
+ilscript[0].content[3] "clear_state | guard { input date | summary date | attribute date; }"
+ilscript[0].content[4] "clear_state | guard { input from | tokenize normalize | summary from | index from; }"
+ilscript[0].content[5] "clear_state | guard { input replyto | summary replyto | index replyto; }"
+ilscript[0].content[6] "clear_state | guard { input to | tokenize normalize | summary to | index to; }"
+ilscript[0].content[7] "clear_state | guard { input cc | tokenize normalize | index cc; }"
+ilscript[0].content[8] "clear_state | guard { input bcc | tokenize normalize | index bcc; }"
+ilscript[0].content[9] "clear_state | guard { input subject | tokenize normalize | summary subject | index subject; }"
+ilscript[0].content[10] "clear_state | guard { input body | summary body | index body; }"
+ilscript[0].content[11] "clear_state | guard { input attachmentcount | summary attachmentcount | attribute attachmentcount; }"
+ilscript[0].content[12] "clear_state | guard { input attachmentnames | tokenize normalize | index attachmentnames; }"
+ilscript[0].content[13] "clear_state | guard { input attachmenttypes | tokenize normalize | index attachmenttypes; }"
+ilscript[0].content[14] "clear_state | guard { input attachmentlanguages | tokenize normalize | index attachmentlanguages; }"
+ilscript[0].content[15] "clear_state | guard { input attachmentcontent | tokenize normalize | summary attachmentcontent | index attachmentcontent; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/index-info.cfg b/config-model/src/test/derived/mail/index-info.cfg
new file mode 100644
index 00000000000..fc5192a6014
--- /dev/null
+++ b/config-model/src/test/derived/mail/index-info.cfg
@@ -0,0 +1,155 @@
+indexinfo[0].name "mail"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "URI"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "URI"
+indexinfo[0].command[3].command "fullurl"
+indexinfo[0].command[4].indexname "URI"
+indexinfo[0].command[4].command "lowercase"
+indexinfo[0].command[5].indexname "URI.URI"
+indexinfo[0].command[5].command "fullurl"
+indexinfo[0].command[6].indexname "URI.URI"
+indexinfo[0].command[6].command "lowercase"
+indexinfo[0].command[7].indexname "URI.path"
+indexinfo[0].command[7].command "fullurl"
+indexinfo[0].command[8].indexname "URI.path"
+indexinfo[0].command[8].command "lowercase"
+indexinfo[0].command[9].indexname "URI.query"
+indexinfo[0].command[9].command "fullurl"
+indexinfo[0].command[10].indexname "URI.query"
+indexinfo[0].command[10].command "lowercase"
+indexinfo[0].command[11].indexname "URI.hostname"
+indexinfo[0].command[11].command "urlhost"
+indexinfo[0].command[12].indexname "URI.hostname"
+indexinfo[0].command[12].command "lowercase"
+indexinfo[0].command[13].indexname "mailid"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "mailid"
+indexinfo[0].command[14].command "lowercase"
+indexinfo[0].command[15].indexname "mailid"
+indexinfo[0].command[15].command "normalize"
+indexinfo[0].command[16].indexname "date"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "date"
+indexinfo[0].command[17].command "attribute"
+indexinfo[0].command[18].indexname "from"
+indexinfo[0].command[18].command "index"
+indexinfo[0].command[19].indexname "sender"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "address"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "header"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "default"
+indexinfo[0].command[22].command "index"
+indexinfo[0].command[23].indexname "all"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "from"
+indexinfo[0].command[24].command "lowercase"
+indexinfo[0].command[25].indexname "sender"
+indexinfo[0].command[25].command "lowercase"
+indexinfo[0].command[26].indexname "address"
+indexinfo[0].command[26].command "lowercase"
+indexinfo[0].command[27].indexname "header"
+indexinfo[0].command[27].command "lowercase"
+indexinfo[0].command[28].indexname "default"
+indexinfo[0].command[28].command "lowercase"
+indexinfo[0].command[29].indexname "all"
+indexinfo[0].command[29].command "lowercase"
+indexinfo[0].command[30].indexname "from"
+indexinfo[0].command[30].command "normalize"
+indexinfo[0].command[31].indexname "sender"
+indexinfo[0].command[31].command "normalize"
+indexinfo[0].command[32].indexname "address"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[33].indexname "header"
+indexinfo[0].command[33].command "normalize"
+indexinfo[0].command[34].indexname "default"
+indexinfo[0].command[34].command "normalize"
+indexinfo[0].command[35].indexname "all"
+indexinfo[0].command[35].command "normalize"
+indexinfo[0].command[36].indexname "replyto"
+indexinfo[0].command[36].command "index"
+indexinfo[0].command[37].indexname "replyto"
+indexinfo[0].command[37].command "lowercase"
+indexinfo[0].command[38].indexname "replyto"
+indexinfo[0].command[38].command "normalize"
+indexinfo[0].command[39].indexname "to"
+indexinfo[0].command[39].command "index"
+indexinfo[0].command[40].indexname "recipient"
+indexinfo[0].command[40].command "index"
+indexinfo[0].command[41].indexname "to"
+indexinfo[0].command[41].command "lowercase"
+indexinfo[0].command[42].indexname "recipient"
+indexinfo[0].command[42].command "lowercase"
+indexinfo[0].command[43].indexname "to"
+indexinfo[0].command[43].command "normalize"
+indexinfo[0].command[44].indexname "recipient"
+indexinfo[0].command[44].command "normalize"
+indexinfo[0].command[45].indexname "cc"
+indexinfo[0].command[45].command "index"
+indexinfo[0].command[46].indexname "cc"
+indexinfo[0].command[46].command "lowercase"
+indexinfo[0].command[47].indexname "cc"
+indexinfo[0].command[47].command "normalize"
+indexinfo[0].command[48].indexname "bcc"
+indexinfo[0].command[48].command "index"
+indexinfo[0].command[49].indexname "bcc"
+indexinfo[0].command[49].command "lowercase"
+indexinfo[0].command[50].indexname "bcc"
+indexinfo[0].command[50].command "normalize"
+indexinfo[0].command[51].indexname "subject"
+indexinfo[0].command[51].command "index"
+indexinfo[0].command[52].indexname "subject"
+indexinfo[0].command[52].command "lowercase"
+indexinfo[0].command[53].indexname "subject"
+indexinfo[0].command[53].command "normalize"
+indexinfo[0].command[54].indexname "body"
+indexinfo[0].command[54].command "index"
+indexinfo[0].command[55].indexname "body"
+indexinfo[0].command[55].command "lowercase"
+indexinfo[0].command[56].indexname "body"
+indexinfo[0].command[56].command "normalize"
+indexinfo[0].command[57].indexname "attachmentcount"
+indexinfo[0].command[57].command "index"
+indexinfo[0].command[58].indexname "attachmentcount"
+indexinfo[0].command[58].command "attribute"
+indexinfo[0].command[59].indexname "attachmentname"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "attachmentname"
+indexinfo[0].command[60].command "lowercase"
+indexinfo[0].command[61].indexname "attachmentname"
+indexinfo[0].command[61].command "normalize"
+indexinfo[0].command[62].indexname "attachmenttype"
+indexinfo[0].command[62].command "index"
+indexinfo[0].command[63].indexname "attachmenttype"
+indexinfo[0].command[63].command "lowercase"
+indexinfo[0].command[64].indexname "attachmenttype"
+indexinfo[0].command[64].command "normalize"
+indexinfo[0].command[65].indexname "attachmentlanguages"
+indexinfo[0].command[65].command "index"
+indexinfo[0].command[66].indexname "attachmentlanguages"
+indexinfo[0].command[66].command "lowercase"
+indexinfo[0].command[67].indexname "attachmentlanguages"
+indexinfo[0].command[67].command "normalize"
+indexinfo[0].command[68].indexname "attachment"
+indexinfo[0].command[68].command "index"
+indexinfo[0].command[69].indexname "attachment"
+indexinfo[0].command[69].command "lowercase"
+indexinfo[0].command[70].indexname "attachment"
+indexinfo[0].command[70].command "normalize"
+indexinfo[0].command[71].indexname "attachments"
+indexinfo[0].command[71].command "index"
+indexinfo[0].command[72].indexname "attachments"
+indexinfo[0].command[72].command "multivalue"
+indexinfo[0].command[73].indexname "rankfeatures"
+indexinfo[0].command[73].command "index"
+indexinfo[0].command[74].indexname "snippet"
+indexinfo[0].command[74].command "index"
+indexinfo[0].command[75].indexname "summaryfeatures"
+indexinfo[0].command[75].command "index"
+indexinfo[0].command[76].indexname "snippet"
+indexinfo[0].command[76].command "dynteaser" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/mail.sd b/config-model/src/test/derived/mail/mail.sd
new file mode 100644
index 00000000000..0010408dbf6
--- /dev/null
+++ b/config-model/src/test/derived/mail/mail.sd
@@ -0,0 +1,99 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search mail {
+
+ stemming: none
+
+ document mail {
+
+ field URI type uri {
+ indexing: summary
+ summary-to: default, mailid
+ }
+
+ field mailid type string {
+ indexing: summary | index
+ match: prefix
+ summary-to: default, mailid
+ }
+
+ field date type int {
+ indexing: summary | attribute | index
+ match: prefix
+ }
+
+ field from type string {
+ indexing: summary | index
+ match: prefix
+ }
+
+ field replyto type string {
+ indexing: summary | index
+ match: prefix
+ }
+
+ field to type string {
+ indexing: summary | index
+ match: prefix
+ }
+
+ field cc type string {
+ indexing: index
+ match: prefix
+ }
+
+ field bcc type string {
+ indexing: index
+ match: prefix
+ }
+
+ field subject type string {
+ indexing: summary | index
+ match: prefix
+ }
+
+ field body type string {
+ indexing: summary | index
+ match: substring
+ body
+ }
+
+ field attachmentcount type int {
+ indexing: summary | index
+ body
+ }
+
+ field attachmentnames type string {
+ indexing: index
+ body
+ }
+
+ field attachmenttypes type string {
+ indexing: index
+ body
+ }
+
+ field attachmentlanguages type string {
+ indexing: index
+ match: prefix
+ body
+ }
+
+ field attachmentcontent type string {
+ indexing: summary | index
+ match: prefix
+ body
+ }
+
+ field attachments type raw[] {
+ body
+ }
+
+ }
+
+ field snippet type string {
+ indexing: (input body | to_string) . (input attachmentcontent | to_string) | summary
+ summary: dynamic
+ }
+
+}
+
diff --git a/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg b/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg
new file mode 100644
index 00000000000..0e95d51bdd8
--- /dev/null
+++ b/config-model/src/test/derived/mail/onlydoc/documentmanager.cfg
@@ -0,0 +1,67 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -88808602
+datatype[1].structtype[0].name "mail.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "URI"
+datatype[1].structtype[0].field[0].datatype 10
+datatype[1].structtype[0].field[1].name "mailid"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "date"
+datatype[1].structtype[0].field[2].datatype 0
+datatype[1].structtype[0].field[3].name "from"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[4].name "replyto"
+datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[5].name "to"
+datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[6].name "cc"
+datatype[1].structtype[0].field[6].datatype 2
+datatype[1].structtype[0].field[7].name "bcc"
+datatype[1].structtype[0].field[7].datatype 2
+datatype[1].structtype[0].field[8].name "subject"
+datatype[1].structtype[0].field[8].datatype 2
+datatype[2].id -1244861287
+datatype[2].arraytype[0].datatype 3
+datatype[3].id -953584901
+datatype[3].structtype[0].name "mail.body"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "body"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[1].name "attachmentcount"
+datatype[3].structtype[0].field[1].datatype 0
+datatype[3].structtype[0].field[2].name "attachmentnames"
+datatype[3].structtype[0].field[2].datatype 2
+datatype[3].structtype[0].field[3].name "attachmenttypes"
+datatype[3].structtype[0].field[3].datatype 2
+datatype[3].structtype[0].field[4].name "attachmentlanguages"
+datatype[3].structtype[0].field[4].datatype 2
+datatype[3].structtype[0].field[5].name "attachmentcontent"
+datatype[3].structtype[0].field[5].datatype 2
+datatype[3].structtype[0].field[6].name "attachments"
+datatype[3].structtype[0].field[6].datatype -1244861287
+datatype[4].id -1081574983
+datatype[4].documenttype[0].name "mail"
+datatype[4].documenttype[0].version 0
+datatype[4].documenttype[0].inherits[0].name "document"
+datatype[4].documenttype[0].inherits[0].version 0
+datatype[4].documenttype[0].headerstruct -88808602
+datatype[4].documenttype[0].bodystruct -953584901
diff --git a/config-model/src/test/derived/mail/rank-profiles.cfg b/config-model/src/test/derived/mail/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/mail/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/summary.cfg b/config-model/src/test/derived/mail/summary.cfg
new file mode 100644
index 00000000000..ac357a934ec
--- /dev/null
+++ b/config-model/src/test/derived/mail/summary.cfg
@@ -0,0 +1,51 @@
+defaultsummaryid 1831052622
+classes[0].id 1831052622
+classes[0].name "default"
+classes[0].fields[0].name "snippet"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "URI"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "mailid"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "date"
+classes[0].fields[3].type "integer"
+classes[0].fields[4].name "from"
+classes[0].fields[4].type "longstring"
+classes[0].fields[5].name "replyto"
+classes[0].fields[5].type "longstring"
+classes[0].fields[6].name "to"
+classes[0].fields[6].type "longstring"
+classes[0].fields[7].name "subject"
+classes[0].fields[7].type "longstring"
+classes[0].fields[8].name "body"
+classes[0].fields[8].type "longstring"
+classes[0].fields[9].name "attachmentcount"
+classes[0].fields[9].type "integer"
+classes[0].fields[10].name "attachmentcontent"
+classes[0].fields[10].type "longstring"
+classes[0].fields[11].name "rankfeatures"
+classes[0].fields[11].type "featuredata"
+classes[0].fields[12].name "summaryfeatures"
+classes[0].fields[12].type "featuredata"
+classes[0].fields[13].name "documentid"
+classes[0].fields[13].type "longstring"
+classes[1].id 1971542976
+classes[1].name "mailid"
+classes[1].fields[0].name "URI"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "mailid"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "rankfeatures"
+classes[1].fields[2].type "featuredata"
+classes[1].fields[3].name "summaryfeatures"
+classes[1].fields[3].type "featuredata"
+classes[2].id 115170470
+classes[2].name "attributeprefetch"
+classes[2].fields[0].name "date"
+classes[2].fields[0].type "integer"
+classes[2].fields[1].name "attachmentcount"
+classes[2].fields[1].type "integer"
+classes[2].fields[2].name "rankfeatures"
+classes[2].fields[2].type "featuredata"
+classes[2].fields[3].name "summaryfeatures"
+classes[2].fields[3].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/summarymap.cfg b/config-model/src/test/derived/mail/summarymap.cfg
new file mode 100644
index 00000000000..2184e43d8eb
--- /dev/null
+++ b/config-model/src/test/derived/mail/summarymap.cfg
@@ -0,0 +1,16 @@
+defaultoutputclass -1
+override[0].field "snippet"
+override[0].command "dynamicteaser"
+override[0].arguments "snippet"
+override[1].field "date"
+override[1].command "attribute"
+override[1].arguments "date"
+override[2].field "attachmentcount"
+override[2].command "attribute"
+override[2].arguments "attachmentcount"
+override[3].field "rankfeatures"
+override[3].command "rankfeatures"
+override[3].arguments ""
+override[4].field "summaryfeatures"
+override[4].command "summaryfeatures"
+override[4].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/vsmfields.cfg b/config-model/src/test/derived/mail/vsmfields.cfg
new file mode 100644
index 00000000000..1006d902cdd
--- /dev/null
+++ b/config-model/src/test/derived/mail/vsmfields.cfg
@@ -0,0 +1,108 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "URI"
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 ""
+fieldspec[1].name "mailid"
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 "prefix"
+fieldspec[2].name "date"
+fieldspec[2].searchmethod INT32
+fieldspec[2].arg1 ""
+fieldspec[3].name "from"
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 "prefix"
+fieldspec[4].name "replyto"
+fieldspec[4].searchmethod AUTOUTF8
+fieldspec[4].arg1 "prefix"
+fieldspec[5].name "to"
+fieldspec[5].searchmethod AUTOUTF8
+fieldspec[5].arg1 "prefix"
+fieldspec[6].name "cc"
+fieldspec[6].searchmethod AUTOUTF8
+fieldspec[6].arg1 "prefix"
+fieldspec[7].name "bcc"
+fieldspec[7].searchmethod AUTOUTF8
+fieldspec[7].arg1 "prefix"
+fieldspec[8].name "subject"
+fieldspec[8].searchmethod AUTOUTF8
+fieldspec[8].arg1 "prefix"
+fieldspec[9].name "snippet"
+fieldspec[9].searchmethod AUTOUTF8
+fieldspec[9].arg1 ""
+fieldspec[10].name "body"
+fieldspec[10].searchmethod AUTOUTF8
+fieldspec[10].arg1 "substring"
+fieldspec[11].name "attachmentcount"
+fieldspec[11].searchmethod INT32
+fieldspec[11].arg1 ""
+fieldspec[12].name "attachmentnames"
+fieldspec[12].searchmethod AUTOUTF8
+fieldspec[12].arg1 ""
+fieldspec[13].name "attachmenttypes"
+fieldspec[13].searchmethod AUTOUTF8
+fieldspec[13].arg1 ""
+fieldspec[14].name "attachmentlanguages"
+fieldspec[14].searchmethod AUTOUTF8
+fieldspec[14].arg1 "prefix"
+fieldspec[15].name "attachmentcontent"
+fieldspec[15].searchmethod AUTOUTF8
+fieldspec[15].arg1 "prefix"
+documenttype[0].name "mail"
+documenttype[0].index[0].name "mailid"
+documenttype[0].index[0].field[0].name "mailid"
+documenttype[0].index[1].name "date"
+documenttype[0].index[1].field[0].name "date"
+documenttype[0].index[2].name "from"
+documenttype[0].index[2].field[0].name "from"
+documenttype[0].index[3].name "sender"
+documenttype[0].index[3].field[0].name "from"
+documenttype[0].index[4].name "address"
+documenttype[0].index[4].field[0].name "from"
+documenttype[0].index[4].field[1].name "to"
+documenttype[0].index[4].field[2].name "cc"
+documenttype[0].index[5].name "header"
+documenttype[0].index[5].field[0].name "from"
+documenttype[0].index[5].field[1].name "to"
+documenttype[0].index[5].field[2].name "cc"
+documenttype[0].index[5].field[3].name "subject"
+documenttype[0].index[6].name "default"
+documenttype[0].index[6].field[0].name "from"
+documenttype[0].index[6].field[1].name "to"
+documenttype[0].index[6].field[2].name "cc"
+documenttype[0].index[6].field[3].name "subject"
+documenttype[0].index[6].field[4].name "body"
+documenttype[0].index[7].name "all"
+documenttype[0].index[7].field[0].name "from"
+documenttype[0].index[7].field[1].name "to"
+documenttype[0].index[7].field[2].name "cc"
+documenttype[0].index[7].field[3].name "subject"
+documenttype[0].index[7].field[4].name "body"
+documenttype[0].index[7].field[5].name "attachmentnames"
+documenttype[0].index[7].field[6].name "attachmenttypes"
+documenttype[0].index[7].field[7].name "attachmentcontent"
+documenttype[0].index[8].name "replyto"
+documenttype[0].index[8].field[0].name "replyto"
+documenttype[0].index[9].name "to"
+documenttype[0].index[9].field[0].name "to"
+documenttype[0].index[10].name "recipient"
+documenttype[0].index[10].field[0].name "to"
+documenttype[0].index[10].field[1].name "cc"
+documenttype[0].index[11].name "cc"
+documenttype[0].index[11].field[0].name "cc"
+documenttype[0].index[12].name "bcc"
+documenttype[0].index[12].field[0].name "bcc"
+documenttype[0].index[13].name "subject"
+documenttype[0].index[13].field[0].name "subject"
+documenttype[0].index[14].name "body"
+documenttype[0].index[14].field[0].name "body"
+documenttype[0].index[15].name "attachmentcount"
+documenttype[0].index[15].field[0].name "attachmentcount"
+documenttype[0].index[16].name "attachmentname"
+documenttype[0].index[16].field[0].name "attachmentnames"
+documenttype[0].index[17].name "attachmenttype"
+documenttype[0].index[17].field[0].name "attachmenttypes"
+documenttype[0].index[18].name "attachmentlanguages"
+documenttype[0].index[18].field[0].name "attachmentlanguages"
+documenttype[0].index[19].name "attachment"
+documenttype[0].index[19].field[0].name "attachmentcontent" \ No newline at end of file
diff --git a/config-model/src/test/derived/mail/vsmsummary.cfg b/config-model/src/test/derived/mail/vsmsummary.cfg
new file mode 100644
index 00000000000..86de4babe13
--- /dev/null
+++ b/config-model/src/test/derived/mail/vsmsummary.cfg
@@ -0,0 +1,38 @@
+outputclass ""
+fieldmap[0].summary "snippet"
+fieldmap[0].document[0].field "snippet"
+fieldmap[0].command FLATTENJUNIPER
+fieldmap[1].summary "URI"
+fieldmap[1].document[0].field "URI"
+fieldmap[1].command NONE
+fieldmap[2].summary "mailid"
+fieldmap[2].document[0].field "mailid"
+fieldmap[2].command NONE
+fieldmap[3].summary "date"
+fieldmap[3].document[0].field "date"
+fieldmap[3].command NONE
+fieldmap[4].summary "from"
+fieldmap[4].document[0].field "from"
+fieldmap[4].command NONE
+fieldmap[5].summary "replyto"
+fieldmap[5].document[0].field "replyto"
+fieldmap[5].command NONE
+fieldmap[6].summary "to"
+fieldmap[6].document[0].field "to"
+fieldmap[6].command NONE
+fieldmap[7].summary "subject"
+fieldmap[7].document[0].field "subject"
+fieldmap[7].command NONE
+fieldmap[8].summary "body"
+fieldmap[8].document[0].field "body"
+fieldmap[8].command NONE
+fieldmap[9].summary "attachmentcount"
+fieldmap[9].document[0].field "attachmentcount"
+fieldmap[9].command NONE
+fieldmap[10].summary "attachmentcontent"
+fieldmap[10].document[0].field "attachmentcontent"
+fieldmap[10].command NONE
+fieldmap[11].summary "rankfeatures"
+fieldmap[11].command NONE
+fieldmap[12].summary "summaryfeatures"
+fieldmap[12].command NONE \ No newline at end of file
diff --git a/config-model/src/test/derived/mlr/mlr.sd b/config-model/src/test/derived/mlr/mlr.sd
new file mode 100644
index 00000000000..69dad8c30e0
--- /dev/null
+++ b/config-model/src/test/derived/mlr/mlr.sd
@@ -0,0 +1,20 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search mlr {
+
+ document mlr {
+
+ field a type string {
+ indexing: index | summary | attribute
+ attribute: prefetch
+ }
+
+ field b type string {
+ indexing: index | summary
+ }
+
+ field ranklog type string {
+ indexing: attribute
+ attribute: prefetch
+ }
+ }
+}
diff --git a/config-model/src/test/derived/mlr/summary.cfg b/config-model/src/test/derived/mlr/summary.cfg
new file mode 100644
index 00000000000..74f5ed567b9
--- /dev/null
+++ b/config-model/src/test/derived/mlr/summary.cfg
@@ -0,0 +1,23 @@
+defaultsummaryid 1868876861
+classes[0].id 1868876861
+classes[0].name "default"
+classes[0].fields[0].name "a"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "b"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "rankfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "summaryfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "documentid"
+classes[0].fields[4].type "longstring"
+classes[1].id 1944325986
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "a"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "ranklog"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "rankfeatures"
+classes[1].fields[2].type "featuredata"
+classes[1].fields[3].name "summaryfeatures"
+classes[1].fields[3].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/multiplesummaries/attributes.cfg b/config-model/src/test/derived/multiplesummaries/attributes.cfg
new file mode 100644
index 00000000000..5fbe4486849
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/attributes.cfg
@@ -0,0 +1,16 @@
+attribute[5]
+attribute[a].collectiontype SINGLE
+attribute[a].datatype STRING
+attribute[a].name "a"
+attribute[abolded].collectiontype SINGLE
+attribute[abolded].datatype STRING
+attribute[abolded].name "abolded"
+attribute[adynamic].collectiontype SINGLE
+attribute[adynamic].datatype STRING
+attribute[adynamic].name "adynamic"
+attribute[c].collectiontype SINGLE
+attribute[c].datatype STRING
+attribute[c].name "c"
+attribute[loc_pos_zcurve].collectiontype SINGLE
+attribute[loc_pos_zcurve].datatype INT64
+attribute[loc_pos_zcurve].name "loc_pos_zcurve"
diff --git a/config-model/src/test/derived/multiplesummaries/ilscripts.cfg b/config-model/src/test/derived/multiplesummaries/ilscripts.cfg
new file mode 100644
index 00000000000..08b6d0f0b04
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/ilscripts.cfg
@@ -0,0 +1,15 @@
+ilscript[1]
+ilscript[multiplesummaries].doctype "multiplesummaries"
+ilscript[multiplesummaries].name "multiplesummaries"
+ilscript[multiplesummaries].content[11]
+ilscript[multiplesummaries].content[0] "clear_state | guard { input a | tokenize normalize stem:\"SHORTEST\" | summary abolded2 | summary aboldeddynamic | summary adynamic2 | attribute a }"
+ilscript[multiplesummaries].content[1] "clear_state | guard { input adynamic | tokenize normalize stem:\"SHORTEST\" | summary adynamic | attribute adynamic }"
+ilscript[multiplesummaries].content[2] "clear_state | guard { input abolded | tokenize normalize stem:\"SHORTEST\" | summary abolded | attribute abolded }"
+ilscript[multiplesummaries].content[3] "clear_state | guard { input b | summary b }"
+ilscript[multiplesummaries].content[4] "clear_state | guard { input c | summary c | attribute c }"
+ilscript[multiplesummaries].content[5] "clear_state | guard { input d | tokenize normalize stem:\"SHORTEST\" | summary d }"
+ilscript[multiplesummaries].content[6] "clear_state | guard { input e | tokenize normalize stem:\"SHORTEST\" | summary dynamice }"
+ilscript[multiplesummaries].content[7] "clear_state | guard { input f | summary f }"
+ilscript[multiplesummaries].content[8] "clear_state | guard { input g | summary g }"
+ilscript[multiplesummaries].content[9] "clear_state | guard { input h | summary h }"
+ilscript[multiplesummaries].content[10] "clear_state | guard { input loc | to_pos | zcurve | attribute loc_pos_zcurve }"
diff --git a/config-model/src/test/derived/multiplesummaries/index-info.cfg b/config-model/src/test/derived/multiplesummaries/index-info.cfg
new file mode 100644
index 00000000000..5ad04f6c9f2
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/index-info.cfg
@@ -0,0 +1,62 @@
+indexinfo[1]
+indexinfo[multiplesummaries].name "multiplesummaries"
+indexinfo[multiplesummaries].alias[0]
+indexinfo[multiplesummaries].command[29]
+indexinfo[multiplesummaries].command[00].command "index"
+indexinfo[multiplesummaries].command[00].indexname "sddocname"
+indexinfo[multiplesummaries].command[01].command "word"
+indexinfo[multiplesummaries].command[01].indexname "sddocname"
+indexinfo[multiplesummaries].command[02].command "index"
+indexinfo[multiplesummaries].command[02].indexname "a"
+indexinfo[multiplesummaries].command[03].command "attribute"
+indexinfo[multiplesummaries].command[03].indexname "a"
+indexinfo[multiplesummaries].command[04].command "index"
+indexinfo[multiplesummaries].command[04].indexname "adynamic"
+indexinfo[multiplesummaries].command[05].command "attribute"
+indexinfo[multiplesummaries].command[05].indexname "adynamic"
+indexinfo[multiplesummaries].command[06].command "index"
+indexinfo[multiplesummaries].command[06].indexname "abolded"
+indexinfo[multiplesummaries].command[07].command "attribute"
+indexinfo[multiplesummaries].command[07].indexname "abolded"
+indexinfo[multiplesummaries].command[08].command "index"
+indexinfo[multiplesummaries].command[08].indexname "b"
+indexinfo[multiplesummaries].command[09].command "index"
+indexinfo[multiplesummaries].command[09].indexname "c"
+indexinfo[multiplesummaries].command[10].command "attribute"
+indexinfo[multiplesummaries].command[10].indexname "c"
+indexinfo[multiplesummaries].command[11].command "index"
+indexinfo[multiplesummaries].command[11].indexname "d"
+indexinfo[multiplesummaries].command[12].command "index"
+indexinfo[multiplesummaries].command[12].indexname "e"
+indexinfo[multiplesummaries].command[13].command "index"
+indexinfo[multiplesummaries].command[13].indexname "f"
+indexinfo[multiplesummaries].command[14].command "index"
+indexinfo[multiplesummaries].command[14].indexname "g"
+indexinfo[multiplesummaries].command[15].command "index"
+indexinfo[multiplesummaries].command[15].indexname "h"
+indexinfo[multiplesummaries].command[16].command "index"
+indexinfo[multiplesummaries].command[16].indexname "loc"
+indexinfo[multiplesummaries].command[17].command "default-position"
+indexinfo[multiplesummaries].command[17].indexname "loc_pos"
+indexinfo[multiplesummaries].command[18].command "index"
+indexinfo[multiplesummaries].command[18].indexname "loc_pos"
+indexinfo[multiplesummaries].command[19].command "index"
+indexinfo[multiplesummaries].command[19].indexname "loc_pos_zcurve"
+indexinfo[multiplesummaries].command[20].command "attribute"
+indexinfo[multiplesummaries].command[20].indexname "loc_pos_zcurve"
+indexinfo[multiplesummaries].command[21].command "dynteaser"
+indexinfo[multiplesummaries].command[21].indexname "adynamic"
+indexinfo[multiplesummaries].command[22].command "highlight"
+indexinfo[multiplesummaries].command[22].indexname "d"
+indexinfo[multiplesummaries].command[23].command "dynteaser"
+indexinfo[multiplesummaries].command[23].indexname "adynamic2"
+indexinfo[multiplesummaries].command[24].command "highlight"
+indexinfo[multiplesummaries].command[24].indexname "abolded2"
+indexinfo[multiplesummaries].command[25].command "dynteaser"
+indexinfo[multiplesummaries].command[25].indexname "aboldeddynamic"
+indexinfo[multiplesummaries].command[26].command "highlight"
+indexinfo[multiplesummaries].command[26].indexname "aboldeddynamic"
+indexinfo[multiplesummaries].command[27].command "highlight"
+indexinfo[multiplesummaries].command[27].indexname "abolded"
+indexinfo[multiplesummaries].command[28].command "dynteaser"
+indexinfo[multiplesummaries].command[28].indexname "dynamice"
diff --git a/config-model/src/test/derived/multiplesummaries/juniperrc.cfg b/config-model/src/test/derived/multiplesummaries/juniperrc.cfg
new file mode 100755
index 00000000000..79d57c7519c
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/juniperrc.cfg
@@ -0,0 +1,17 @@
+prefix true
+override[3]
+override[abolded].fieldname "abolded"
+override[abolded].length 65536
+override[abolded].max_matches 1
+override[abolded].min_length 8192
+override[abolded].surround_max 65536
+override[abolded2].fieldname "abolded2"
+override[abolded2].length 65536
+override[abolded2].max_matches 1
+override[abolded2].min_length 8192
+override[abolded2].surround_max 65536
+override[d].fieldname "d"
+override[d].length 65536
+override[d].max_matches 1
+override[d].min_length 8192
+override[d].surround_max 65536
diff --git a/config-model/src/test/derived/multiplesummaries/multiplesummaries.sd b/config-model/src/test/derived/multiplesummaries/multiplesummaries.sd
new file mode 100644
index 00000000000..86157133278
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/multiplesummaries.sd
@@ -0,0 +1,199 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search multiplesummaries {
+
+ document multiplesummaries {
+
+ field a type string {
+ indexing: summary | attribute
+ summary-to: default, second
+ match {
+ token
+ }
+ }
+
+ field adynamic type string {
+ indexing: summary | attribute
+ summary-to: default, second
+ summary adynamic: dynamic
+ match {
+ token
+ }
+ }
+
+ field abolded type string {
+ indexing: summary | attribute
+ bolding: on
+ match {
+ token
+ }
+ }
+
+ field b type string {
+ indexing: summary
+ bolding: off
+ }
+
+ field c type string {
+ indexing: summary | attribute
+ summary-to: second
+ match {
+ token
+ }
+ }
+
+ field d type string {
+ indexing: summary
+ bolding: on
+ }
+
+ field e type string {
+ indexing: summary
+ summary dynamice: dynamic
+ }
+
+ field f type array<string> {
+ indexing: summary
+ summary-to: second
+ }
+
+ field g type array<int> {
+ indexing: summary
+ }
+
+ field h type weightedset<string> {
+ indexing: summary
+ }
+
+ field loc type string {
+
+ }
+ }
+
+ field loc_pos type position {
+ indexing: input loc | to_pos | attribute | summary
+ }
+
+ document-summary third {
+
+ summary a type string {
+ }
+
+ summary adynamic type string {
+ }
+
+ summary d type string {
+ }
+
+ summary e type string {
+ }
+
+ summary f type array<string> {
+ }
+
+ summary g type array<int> {
+ }
+
+ summary h type weightedset<string> {
+ }
+
+ }
+
+ document-summary attributesonly1 {
+
+ summary a type string {
+ }
+
+ summary c type string {
+ }
+
+ }
+
+ # Since a here is a dynamic summary field, it will be fetched from disk
+ document-summary notattributesonly1 {
+
+ summary adynamic type string { # Should still be dynamic here
+ }
+
+ summary c type string {
+ }
+
+ }
+
+ # Since a here is a dynamic summary, it will be fetched from disk
+ document-summary notattributesonly2 {
+
+ summary adynamic2 type string { # Should still be dynamic here
+ source: a
+ dynamic
+ }
+
+ summary c type string {
+ }
+
+ }
+
+ # Not attributes only because d is bolded
+ document-summary notattributesonly3 {
+
+ summary a type string {
+ }
+
+ summary d type string {
+ }
+
+ }
+
+ document-summary attributesonly2 {
+
+ summary anotdynamic type string { # Should not be dynamic here
+ source: adynamic
+ }
+
+ summary c type string {
+ }
+
+ summary loc_position type long {
+ }
+
+ }
+
+ document-summary attributesonly3 {
+
+ summary a type string {
+ }
+
+ summary anotbolded type string {
+ source: a
+ }
+
+ summary loc_position type long {
+ }
+
+ }
+
+ document-summary notattributesonly4 {
+
+ summary abolded2 type string {
+ source: a
+ bolding: on
+ }
+
+ summary c type string {
+ }
+
+ }
+
+ document-summary notattributesonly5 {
+
+ summary aboldeddynamic type string {
+ source: a
+ dynamic
+ bolding: on
+ }
+
+ summary c type string {
+ }
+
+ }
+
+}
diff --git a/config-model/src/test/derived/multiplesummaries/summary.cfg b/config-model/src/test/derived/multiplesummaries/summary.cfg
new file mode 100644
index 00000000000..e282afebf39
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/summary.cfg
@@ -0,0 +1,186 @@
+defaultsummaryid 235127765
+classes[12]
+classes[1156201411].id 1156201411
+classes[1156201411].name "attributeprefetch"
+classes[1156201411].fields[5]
+classes[1156201411].fields[a].name "a"
+classes[1156201411].fields[a].type "longstring"
+classes[1156201411].fields[c].name "c"
+classes[1156201411].fields[c].type "longstring"
+classes[1156201411].fields[loc_pos_zcurve].name "loc_pos_zcurve"
+classes[1156201411].fields[loc_pos_zcurve].type "int64"
+classes[1156201411].fields[rankfeatures].name "rankfeatures"
+classes[1156201411].fields[rankfeatures].type "longstring"
+classes[1156201411].fields[summaryfeatures].name "summaryfeatures"
+classes[1156201411].fields[summaryfeatures].type "longstring"
+classes[1277791169].id 1277791169
+classes[1277791169].name "notattributesonly2"
+classes[1277791169].fields[4]
+classes[1277791169].fields[adynamic2].name "adynamic2"
+classes[1277791169].fields[adynamic2].type "longstring"
+classes[1277791169].fields[c].name "c"
+classes[1277791169].fields[c].type "longstring"
+classes[1277791169].fields[rankfeatures].name "rankfeatures"
+classes[1277791169].fields[rankfeatures].type "longstring"
+classes[1277791169].fields[summaryfeatures].name "summaryfeatures"
+classes[1277791169].fields[summaryfeatures].type "longstring"
+classes[1280967808].id 1280967808
+classes[1280967808].name "attributesonly2"
+classes[1280967808].fields[5]
+classes[1280967808].fields[anotdynamic].name "anotdynamic"
+classes[1280967808].fields[anotdynamic].type "longstring"
+classes[1280967808].fields[c].name "c"
+classes[1280967808].fields[c].type "longstring"
+classes[1280967808].fields[loc_position].name "loc_position"
+classes[1280967808].fields[loc_position].type "int64"
+classes[1280967808].fields[rankfeatures].name "rankfeatures"
+classes[1280967808].fields[rankfeatures].type "longstring"
+classes[1280967808].fields[summaryfeatures].name "summaryfeatures"
+classes[1280967808].fields[summaryfeatures].type "longstring"
+classes[1334083320].id 1334083320
+classes[1334083320].name "third"
+classes[1334083320].fields[9]
+classes[1334083320].fields[a].name "a"
+classes[1334083320].fields[a].type "longstring"
+classes[1334083320].fields[adynamic].name "adynamic"
+classes[1334083320].fields[adynamic].type "longstring"
+classes[1334083320].fields[d].name "d"
+classes[1334083320].fields[d].type "longstring"
+classes[1334083320].fields[e].name "e"
+classes[1334083320].fields[e].type "longstring"
+classes[1334083320].fields[f].name "f"
+classes[1334083320].fields[f].type "jsonstring"
+classes[1334083320].fields[g].name "g"
+classes[1334083320].fields[g].type "jsonstring"
+classes[1334083320].fields[h].name "h"
+classes[1334083320].fields[h].type "jsonstring"
+classes[1334083320].fields[rankfeatures].name "rankfeatures"
+classes[1334083320].fields[rankfeatures].type "longstring"
+classes[1334083320].fields[summaryfeatures].name "summaryfeatures"
+classes[1334083320].fields[summaryfeatures].type "longstring"
+classes[1439192258].id 1439192258
+classes[1439192258].name "second"
+classes[1439192258].fields[6]
+classes[1439192258].fields[a].name "a"
+classes[1439192258].fields[a].type "longstring"
+classes[1439192258].fields[adynamic].name "adynamic"
+classes[1439192258].fields[adynamic].type "longstring"
+classes[1439192258].fields[c].name "c"
+classes[1439192258].fields[c].type "longstring"
+classes[1439192258].fields[f].name "f"
+classes[1439192258].fields[f].type "jsonstring"
+classes[1439192258].fields[rankfeatures].name "rankfeatures"
+classes[1439192258].fields[rankfeatures].type "longstring"
+classes[1439192258].fields[summaryfeatures].name "summaryfeatures"
+classes[1439192258].fields[summaryfeatures].type "longstring"
+classes[1653275739].id 1653275739
+classes[1653275739].name "attributesonly3"
+classes[1653275739].fields[5]
+classes[1653275739].fields[a].name "a"
+classes[1653275739].fields[a].type "longstring"
+classes[1653275739].fields[anotbolded].name "anotbolded"
+classes[1653275739].fields[anotbolded].type "longstring"
+classes[1653275739].fields[loc_position].name "loc_position"
+classes[1653275739].fields[loc_position].type "int64"
+classes[1653275739].fields[rankfeatures].name "rankfeatures"
+classes[1653275739].fields[rankfeatures].type "longstring"
+classes[1653275739].fields[summaryfeatures].name "summaryfeatures"
+classes[1653275739].fields[summaryfeatures].type "longstring"
+classes[182001096].id 182001096
+classes[182001096].name "notattributesonly1"
+classes[182001096].fields[4]
+classes[182001096].fields[adynamic].name "adynamic"
+classes[182001096].fields[adynamic].type "longstring"
+classes[182001096].fields[c].name "c"
+classes[182001096].fields[c].type "longstring"
+classes[182001096].fields[rankfeatures].name "rankfeatures"
+classes[182001096].fields[rankfeatures].type "longstring"
+classes[182001096].fields[summaryfeatures].name "summaryfeatures"
+classes[182001096].fields[summaryfeatures].type "longstring"
+classes[1881063334].id 1881063334
+classes[1881063334].name "notattributesonly4"
+classes[1881063334].fields[4]
+classes[1881063334].fields[abolded2].name "abolded2"
+classes[1881063334].fields[abolded2].type "longstring"
+classes[1881063334].fields[c].name "c"
+classes[1881063334].fields[c].type "longstring"
+classes[1881063334].fields[rankfeatures].name "rankfeatures"
+classes[1881063334].fields[rankfeatures].type "longstring"
+classes[1881063334].fields[summaryfeatures].name "summaryfeatures"
+classes[1881063334].fields[summaryfeatures].type "longstring"
+classes[1988966242].id 1988966242
+classes[1988966242].name "attributesonly1"
+classes[1988966242].fields[4]
+classes[1988966242].fields[a].name "a"
+classes[1988966242].fields[a].type "longstring"
+classes[1988966242].fields[c].name "c"
+classes[1988966242].fields[c].type "longstring"
+classes[1988966242].fields[rankfeatures].name "rankfeatures"
+classes[1988966242].fields[rankfeatures].type "longstring"
+classes[1988966242].fields[summaryfeatures].name "summaryfeatures"
+classes[1988966242].fields[summaryfeatures].type "longstring"
+classes[235127765].id 235127765
+classes[235127765].name "multiplesummaries"
+classes[235127765].fields[20]
+classes[235127765].fields[a].name "a"
+classes[235127765].fields[a].type "longstring"
+classes[235127765].fields[abolded].name "abolded"
+classes[235127765].fields[abolded].type "longstring"
+classes[235127765].fields[abolded2].name "abolded2"
+classes[235127765].fields[abolded2].type "longstring"
+classes[235127765].fields[aboldeddynamic].name "aboldeddynamic"
+classes[235127765].fields[aboldeddynamic].type "longstring"
+classes[235127765].fields[adynamic].name "adynamic"
+classes[235127765].fields[adynamic].type "longstring"
+classes[235127765].fields[adynamic2].name "adynamic2"
+classes[235127765].fields[adynamic2].type "longstring"
+classes[235127765].fields[b].name "b"
+classes[235127765].fields[b].type "longstring"
+classes[235127765].fields[c].name "c"
+classes[235127765].fields[c].type "longstring"
+classes[235127765].fields[d].name "d"
+classes[235127765].fields[d].type "longstring"
+classes[235127765].fields[documentid].name "documentid"
+classes[235127765].fields[documentid].type "longstring"
+classes[235127765].fields[dynamice].name "dynamice"
+classes[235127765].fields[dynamice].type "longstring"
+classes[235127765].fields[e].name "e"
+classes[235127765].fields[e].type "longstring"
+classes[235127765].fields[f].name "f"
+classes[235127765].fields[f].type "jsonstring"
+classes[235127765].fields[g].name "g"
+classes[235127765].fields[g].type "jsonstring"
+classes[235127765].fields[h].name "h"
+classes[235127765].fields[h].type "jsonstring"
+classes[235127765].fields[loc_pos.distance].name "loc_pos.distance"
+classes[235127765].fields[loc_pos.distance].type "integer"
+classes[235127765].fields[loc_pos.position].name "loc_pos.position"
+classes[235127765].fields[loc_pos.position].type "xmlstring"
+classes[235127765].fields[loc_position].name "loc_position"
+classes[235127765].fields[loc_position].type "int64"
+classes[235127765].fields[rankfeatures].name "rankfeatures"
+classes[235127765].fields[rankfeatures].type "longstring"
+classes[235127765].fields[summaryfeatures].name "summaryfeatures"
+classes[235127765].fields[summaryfeatures].type "longstring"
+classes[803323247].id 803323247
+classes[803323247].name "notattributesonly3"
+classes[803323247].fields[4]
+classes[803323247].fields[a].name "a"
+classes[803323247].fields[a].type "longstring"
+classes[803323247].fields[d].name "d"
+classes[803323247].fields[d].type "longstring"
+classes[803323247].fields[rankfeatures].name "rankfeatures"
+classes[803323247].fields[rankfeatures].type "longstring"
+classes[803323247].fields[summaryfeatures].name "summaryfeatures"
+classes[803323247].fields[summaryfeatures].type "longstring"
+classes[937467944].id 937467944
+classes[937467944].name "notattributesonly5"
+classes[937467944].fields[4]
+classes[937467944].fields[aboldeddynamic].name "aboldeddynamic"
+classes[937467944].fields[aboldeddynamic].type "longstring"
+classes[937467944].fields[c].name "c"
+classes[937467944].fields[c].type "longstring"
+classes[937467944].fields[rankfeatures].name "rankfeatures"
+classes[937467944].fields[rankfeatures].type "longstring"
+classes[937467944].fields[summaryfeatures].name "summaryfeatures"
+classes[937467944].fields[summaryfeatures].type "longstring"
diff --git a/config-model/src/test/derived/multiplesummaries/summarymap.cfg b/config-model/src/test/derived/multiplesummaries/summarymap.cfg
new file mode 100644
index 00000000000..430715062c8
--- /dev/null
+++ b/config-model/src/test/derived/multiplesummaries/summarymap.cfg
@@ -0,0 +1,50 @@
+defaultoutputclass -1
+override[16]
+override[a].arguments "a"
+override[a].command "attribute"
+override[a].field "a"
+override[abolded].arguments "abolded"
+override[abolded].command "dynamicteaser"
+override[abolded].field "abolded"
+override[abolded2].arguments "abolded2"
+override[abolded2].command "dynamicteaser"
+override[abolded2].field "abolded2"
+override[aboldeddynamic].arguments "aboldeddynamic"
+override[aboldeddynamic].command "dynamicteaser"
+override[aboldeddynamic].field "aboldeddynamic"
+override[adynamic].arguments "adynamic"
+override[adynamic].command "dynamicteaser"
+override[adynamic].field "adynamic"
+override[adynamic2].arguments "adynamic2"
+override[adynamic2].command "dynamicteaser"
+override[adynamic2].field "adynamic2"
+override[anotbolded].arguments "a"
+override[anotbolded].command "attribute"
+override[anotbolded].field "anotbolded"
+override[anotdynamic].arguments "adynamic"
+override[anotdynamic].command "attribute"
+override[anotdynamic].field "anotdynamic"
+override[c].arguments "c"
+override[c].command "attribute"
+override[c].field "c"
+override[d].arguments "d"
+override[d].command "dynamicteaser"
+override[d].field "d"
+override[dynamice].arguments "dynamice"
+override[dynamice].command "dynamicteaser"
+override[dynamice].field "dynamice"
+override[loc_pos.distance].arguments "loc_pos_zcurve"
+override[loc_pos.distance].command "absdist"
+override[loc_pos.distance].field "loc_pos.distance"
+override[loc_pos.position].arguments "loc_pos_zcurve"
+override[loc_pos.position].command "positions"
+override[loc_pos.position].field "loc_pos.position"
+override[loc_pos_zcurve].arguments "loc_pos_zcurve"
+override[loc_pos_zcurve].command "attribute"
+override[loc_pos_zcurve].field "loc_pos_zcurve"
+override[rankfeatures].arguments ""
+override[rankfeatures].command "rankfeatures"
+override[rankfeatures].field "rankfeatures"
+override[summaryfeatures].arguments ""
+override[summaryfeatures].command "summaryfeatures"
+override[summaryfeatures].field "summaryfeatures"
diff --git a/config-model/src/test/derived/music/attributes.cfg b/config-model/src/test/derived/music/attributes.cfg
new file mode 100644
index 00000000000..5ded3dc494d
--- /dev/null
+++ b/config-model/src/test/derived/music/attributes.cfg
@@ -0,0 +1,209 @@
+attribute[0].name "sales"
+attribute[0].datatype INT32
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "pto"
+attribute[1].datatype INT32
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "mid"
+attribute[2].datatype INT32
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "weight"
+attribute[3].datatype FLOAT
+attribute[3].collectiontype SINGLE
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "bgnpfrom"
+attribute[4].datatype FLOAT
+attribute[4].collectiontype SINGLE
+attribute[4].removeifzero false
+attribute[4].createifnonexistent false
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "newestedition"
+attribute[5].datatype INT32
+attribute[5].collectiontype SINGLE
+attribute[5].removeifzero false
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "year"
+attribute[6].datatype INT32
+attribute[6].collectiontype SINGLE
+attribute[6].removeifzero false
+attribute[6].createifnonexistent false
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "did"
+attribute[7].datatype INT32
+attribute[7].collectiontype SINGLE
+attribute[7].removeifzero false
+attribute[7].createifnonexistent false
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "cbid"
+attribute[8].datatype INT32
+attribute[8].collectiontype SINGLE
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch false
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype ""
+attribute[9].name "hiphopvalue_arr"
+attribute[9].datatype STRING
+attribute[9].collectiontype ARRAY
+attribute[9].removeifzero false
+attribute[9].createifnonexistent false
+attribute[9].fastsearch false
+attribute[9].huge false
+attribute[9].sortascending true
+attribute[9].sortfunction UCA
+attribute[9].sortstrength PRIMARY
+attribute[9].sortlocale ""
+attribute[9].enablebitvectors false
+attribute[9].enableonlybitvector false
+attribute[9].fastaccess false
+attribute[9].arity 8
+attribute[9].lowerbound -9223372036854775808
+attribute[9].upperbound 9223372036854775807
+attribute[9].densepostinglistthreshold 0.4
+attribute[9].tensortype ""
+attribute[10].name "metalvalue_arr"
+attribute[10].datatype STRING
+attribute[10].collectiontype ARRAY
+attribute[10].removeifzero false
+attribute[10].createifnonexistent false
+attribute[10].fastsearch false
+attribute[10].huge false
+attribute[10].sortascending true
+attribute[10].sortfunction UCA
+attribute[10].sortstrength PRIMARY
+attribute[10].sortlocale ""
+attribute[10].enablebitvectors false
+attribute[10].enableonlybitvector false
+attribute[10].fastaccess false
+attribute[10].arity 8
+attribute[10].lowerbound -9223372036854775808
+attribute[10].upperbound 9223372036854775807
+attribute[10].densepostinglistthreshold 0.4
+attribute[10].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/music/defs/attributes.def b/config-model/src/test/derived/music/defs/attributes.def
new file mode 100644
index 00000000000..bb3a0df6299
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/attributes.def
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+attribute[].name string
+attribute[].datatype string
+attribute[].multivalue bool default=false
+attribute[].sortsigned bool default=true
+attribute[].disableprep bool default=false
diff --git a/config-model/src/test/derived/music/defs/documentmanager.def b/config-model/src/test/derived/music/defs/documentmanager.def
new file mode 100644
index 00000000000..a310e9f13c8
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/documentmanager.def
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=document.config
+datatype[].id int
+datatype[].arraytype[].datatype int
+documenttype[].name string
+documenttype[].version int
+documenttype[].inherits[].name string
+documenttype[].inherits[].version int
+documenttype[].field[].name string
+documenttype[].field[].id int
+documenttype[].field[].header bool
+documenttype[].field[].datatype int
diff --git a/config-model/src/test/derived/music/defs/extra.def b/config-model/src/test/derived/music/defs/extra.def
new file mode 100644
index 00000000000..cc03f1b39d3
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/extra.def
@@ -0,0 +1,4 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=test
+file[].name string
+file[].content string
diff --git a/config-model/src/test/derived/music/defs/ilscripts.def b/config-model/src/test/derived/music/defs/ilscripts.def
new file mode 100644
index 00000000000..d999742fa3c
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/ilscripts.def
@@ -0,0 +1,5 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.configdefinition
+ilscript[].name string
+ilscript[].doctype string
+ilscript[].content[] string
diff --git a/config-model/src/test/derived/music/defs/rank-profiles.def b/config-model/src/test/derived/music/defs/rank-profiles.def
new file mode 100644
index 00000000000..0d7cf27ff06
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/rank-profiles.def
@@ -0,0 +1,344 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+## name of this rank profile. maps to table index for internal use.
+rankprofile[].name string
+
+## the name of a generic property available to the feature execution framework and feature plugins
+rankprofile[].fef.property[].name string
+
+## the value of a generic property available to feature plugins
+rankprofile[].fef.property[].value string
+
+## the catalog name overrides apply to
+rankprofile[].catalog[].name string
+
+## Boost value for AND queries in this catalog.
+rankprofile[].catalog[].andboost int default=0
+
+## Boost value for OR queries in this catalog.
+rankprofile[].catalog[].orboost int default=0
+
+## Boost value for ANY queries in this catalog.
+rankprofile[].catalog[].anyboost int default=0
+
+## Boost value for NEAR queries in catalog.
+rankprofile[].catalog[].nearboost int default=0
+
+## Boost value for ORDEREDNEAR queries in this catalog.
+rankprofile[].catalog[].orderednearboost int default=0
+
+## Boost value for phrase queries in this catalog.
+rankprofile[].catalog[].phraseboost int default=0
+
+## Boost value for all queries in catalog.
+rankprofile[].catalog[].rankboost int default=0
+
+## If true, the context boost is the max value of
+## the individual contextboosts.
+## When false, the context boost when a term is in
+## several contexts is the sum of the individual contextboosts.
+rankprofile[].catalog[].bestcontextboostonly bool default=false
+
+
+## If true, then use extnumoccboost only when calculating rank values.
+## Also, do not normalize the extnumoccboost value with
+## global term frequency. Default value is false.
+rankprofile[].catalog[].extnumoccboostonly bool default=false
+
+## If yes, then use extnumoccboost only when calculating rank values.
+## Also, do not normalize the extnumoccboost value with
+## global term frequency. Default value is no.
+rankprofile[].catalog[].numoccandextnumoccboostonly bool default=false
+
+## If yes, then use bitvectors when possible.
+## Default value is false.
+rankprofile[].catalog[].preferbitvector bool default=false
+
+## Load extnumoccboost for this catalog from the named file.
+## extnumoccboost specifies boost values due to the number of
+## occurences of a term that are external to the document. If
+## "NULL" is given as file name, then all extnumoccboost values
+## will be set to 0.
+rankprofile[].catalog[].extnumoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load numoccboost for this catalog from the named file.
+## numoccboost specifies boost values due to the number of occurences in
+## a document. If "NULL" is given as file name, then all numoccboost
+## values will be set to 0.
+rankprofile[].catalog[].numoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load firstoccboost for catalog from the file named.
+## firstoccboost specifies boost values due to the position of the
+## first occurence in a document. If "NULL" is given as file name,
+## then all firstoccboost values will be set to 0.
+rankprofile[].catalog[].firstoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+
+## Load firstoccproximityboost for this catalog from the file named.
+## firstoccproximity boost specifies boost values due to the correlation between
+## positions of the first occurence in a document for two and two words.
+##
+## If "NULL" is given as file name, then all
+## firstoccproximityboost values will be set to 0. If otherwise set,
+## should be the name of a file to load into the table. The file
+## should have 256 lines each containing a single integer.
+##
+## There are 256 elements in the table, handling forward distances from 1.
+## The corresponding firstoccrevproximityboost table is used
+## to handle closeness in reverse order.
+##
+## The last array index specifies the proximity table set. During
+## evaluation, the bigram proximity weight supplied by the query segmenter
+## specifies which proximity table set to use, with a fallback to set 0
+## when no information is available.
+rankprofile[].catalog[].firstoccproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load firstoccrevproximityboost table for this catalog from the named file.
+## Specifies boost values due to the correlation between positions
+## of the first occurence in a document for two and two words when
+## the second word in the query comes first in the document.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].firstoccrevproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load proximityboost for this catalog from the named file.
+## proximity boost specifies boost values due to the correlation between
+## positions of the occurences in a document for two and two words.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].proximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load revproximityboost for this catalog from the named file.
+## revproximity boost specifies boost values due to the correlation between
+## positions of the occurences in a document for two and two words.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].revproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load divtable for this catalog from the named file.
+## Rank values for a query term are divided by the entry
+## in divtable indexed by log2 of term frequence.
+## The file should contain ?? lines each with a single integer.
+rankprofile[].catalog[].divtable string default=""
+
+## The name of a context in this catalog to specify boosts for.
+rankprofile[].catalog[].context[].name string
+
+## Boost occurrences in this context with the given value.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].contextboost int default=0
+
+## Boost pair of occurrences in this context with
+## the given value when evaluating 2 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.pair int default=0
+
+## Boost triple of occurrences in this context with
+## the given value when evaluating 3 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.triple int default=0
+
+## Boost quad of occurrences in this context with
+## the given value when evaluating 4 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.quad int default=0
+
+
+## The name of the attribute
+rankprofile[].attribute[].name string
+
+## Boost value for queries that hit in this attribute
+rankprofile[].attribute[].attributecontextboost int default=0
+
+## Load weightboost for this attribute from the named file.
+## weightboost specifies boost values due to the weight (weighted set)
+## or number of occurences (single, array) in an attribute.
+## If "NULL" is given as file name, then all weightboost values will be set to 0.
+rankprofile[].attribute[].weightboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+
+## Load static rank values from the given staticrank docattr vector.
+## Must be specified in index.cf as a staticrankfile.
+rankprofile[].staticrankfile string default=""
+
+## Multiply static rank values with given value when calculating total
+## rank value.
+rankprofile[].staticcoefficient int default=1
+
+## If false then use only static ranking when sorting result hits.
+## Default is true.
+rankprofile[].dynamicranking bool default=true
+
+## If dynamic ranking is turned off, then ascending will sort the
+## result hits with lowest static rank values first, while
+## descending will sort with highest static rank values
+## first. Default is descending. This keyword has no effect if
+## dynamic ranking is on.
+rankprofile[].staticranksortorder string default="descending"
+
+## Load static rank mapping from the file named table. The static
+## rank mapping maps each 8-bit static rank value into a 32-bit static
+## rank value. This option may only be used with 8-bit static rank files.
+rankprofile[].staticrankmap string default=""
+
+## If set to "true", total rank will be reduced when dynamic rank is less than
+## 25% of static rank, to suppress irrelevant hits from popular sites.
+## If set to "false", total rank is not reduced.
+rankprofile[].clampstaticrank bool default=false
+
+## Load document datetime values used for freshness boost calculation from
+## this file. The values must be coded as minutes since
+## 1900-01-01T00:00Z. The value 0 has the special meaning
+## "no datetime value exists".
+rankprofile[].freshnessboost.file string default=""
+
+## Load freshnessboost lookup-table values from the file named
+## table instead of using built-in default values. The file must
+## contain 32 white-space separated non-negative integers.
+rankprofile[].freshnessboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## When calculating the freshness boost value multiply difference between
+## current datetime and document datetime with timeoffset before taking
+## the base-2 logarithm. Default value is 1. Max value is 31.
+rankprofile[].freshnessboost.timeoffset int default=1
+
+## If a document has datetime value 0, then use defaultboostvalue
+## as freshness boost value instead of doing table lookup. The default
+## default value is 0 (no boost).
+rankprofile[].freshnessboost.defaultboostvalue int default=0
+
+## Multiply freshness boost value with coefficient when calculating
+## total freshness boost value. If coefficient 0 is used, no freshness
+## boost value will be computed or added. Default value is 0.
+rankprofile[].freshnessboost.coefficient int default=0
+
+## boost table files for distance ranking, 1 dimension.
+## The tables have 465 elements each, where slots 0..15 represents
+## distances 0..15 while the remaining slots represents distance
+## (16 + (slot & 15)) << ((slot >> 4) - 1). Linear interpolation is
+## used for distances "between" table slots.
+##
+## If "NULL" is given as the file name then all 1D distance boost values
+## for that table will be set to 0.
+rankprofile[].distance1dboosttable[].table string
+
+## boost table files for distance ranking, 2 dimensions.
+## The tables have 977 elements each, where slots 0..15 represents
+## square of distance being 0..15 while the remaining slots represents
+## square of distance distance being
+## (16 + (slot & 15)) << ((slot >> 4) - 1). Linear interpolation is
+## used for distances "between" table slots.
+##
+## If "NULL" is given as the file name then all 2D distance boost values
+## for that table will be set to 0.
+rankprofile[].distance2dboosttable[].table string
+
+## The lowest possible size of a ranked result. This is the lower ramp
+## of the percentage specified in the binsize variable. The default is
+## specified in fsearchrc.
+rankprofile[].binlow int default=-1
+
+## The high limit of the ranked result bin. If the percentage of the
+## resultset specified in binsize is higher than this limit, this will be
+## the max size. The default is specified in fsearchrc.
+rankprofile[].binhigh int default=-1
+
+## The size of the ranked results as a percentage of the total result
+## set size. The percentage can be ramped off with the binlow and binhigh
+## variables. The default is specified in fsearchrc.
+rankprofile[].binsize double default=-1
+
+## Minimum value for maximum value of number of 'posocc' entries for a word.
+## The default is specified in fsearchrc.
+rankprofile[].posbinlow int default=-1
+
+## Maximum value for maximum value of number of 'posocc' entries for a word.
+## The default is specified in fsearchrc.
+rankprofile[].posbinhigh int default=-1
+
+## The maximum value for number of 'posocc' entries for a word, specified
+## as a percentage of the number of documents in the index. If more
+## entries are needed for evaluation, posocc entries are not used for that
+## word and evaluation will be performed without full proximity support.
+## The percentage can be ramped off with the posbinlow and posbinhigh
+## variables. The default is specified in fsearchrc.
+rankprofile[].posbinsize int default=-1
+
+## Boost value that is added to the relevance score of hits from superior
+## searches (searches where recall is sacrificed for better
+## precision). The rank cutoff feature will not be affected by this
+## feature (rank cutoff is applied before the superior boost).
+rankprofile[].superiorboost int default=0
+
+## Name of rank profile to be used when running superior searches
+## (searches where recall is sacrificed for better precision). If not
+## set, the current ranking profile will be used.
+##
+## If a profile for a superior search has this set then a superior^2
+## search exist (with more recall sacrificed than for superior searches)
+## and search behavior is slightly changed:
+##
+## If the search node has been asked to perform a superior search then an
+## internal double fallthrough with (superior, superior^2) search is
+## performed. If the search node has been asked to perform an internal
+## double fallthrough then a triple fallthrough with (normal, superior,
+## superior^2) is performed.
+rankprofile[].superiorname string default=""
+
+## After all other rank calculations, the rank value is tuned according
+## to the tunefactor and tunebias values. The rank value is modified
+## as follows: new_rank = old_rank * tunefactor + tunebias.
+rankprofile[].tunefactor double default=1.0
+
+## After all other rank calculations, the rank value is tuned according
+## to the tunefactor and tunebias values. The rank value is modified
+## as follows: new_rank = old_rank * tunefactor + tunebias.
+rankprofile[].tunebias int default=0
+
+## A lower limit for the rankvalue of the results returned from the
+## search node. If rankcutoff.advanced is set to "true", determines
+## the constant value used in the internal advanced rank cutoff
+## calculations. This roughly reflects the expected rank contribution
+## of one good term.
+## The rankcutoff.val value and the rankcutoff.advanced parameter
+## may be used if you only want hits with a minimum relevancy to show
+## up in the resultset.
+## A value below zero means no rankcutoff is done.
+rankprofile[].rankcutoff.val int default=-1
+
+## When rankcutoff.val is in use, this flag controls whether to use
+## an internal calculation is used for determining the rank cutoff
+## value. If "false", use rankcutoff.val as a direct lower limit.
+rankprofile[].rankcutoff.advanced bool default=false
+
+## If set to "ON", use of posocc files is enabled, except when
+## "forceemptyposoccs" is set in fsearchrc or posocc files doesn't exist.
+## If set to "OFF", use of posocc files is disabled.
+## If "NOTSET" the fsearchrc "proximity" parameter is used instead.
+rankprofile[].proximity.full.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## If set to "ON", use of firstoccproximity is enabled.
+## If set to "OFF", use of firstoccproximity is disabled.
+## When NOTSET use the firstoccproximity value in fsearchrc configuration.
+rankprofile[].proximity.firstocc.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## If set to "ON", use of proximity (cf. proximity and firstoccproximity)
+## will affect phrases in addition to single words.
+## If set to "OFF", proximity is never used for phrases.
+## When NOTSET use the phraseproximity value in fsearchrc configuration.
+rankprofile[].proximity.phrase.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## Selects behavior when proximity can be used for two words but not three
+## words while firstoccproximity can be used for three words.
+## If set to "ON", then use proximity for two words.
+## If set to "OFF", then use firstoccproximity for three words.
+## When NOTSET use the proximitypairbeforefirstoccproximitytriple value
+## in fsearchrc configuration.
+rankprofile[].proximity.pairbeforefirstocctriple.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## Selects behavior when proximity can be used for three words but not four
+## words while firstoccproximity can be used for four words.
+## If set to "ON", then use proximity for three words.
+## If set to "OFF", then use firstoccproximity for four words.
+## When NOTSET use the proximitytriplebeforefirstoccproximityquad value
+rankprofile[].proximity.triplebeforefirstoccquad.enable enum { OFF, ON, NOTSET } default=NOTSET
diff --git a/config-model/src/test/derived/music/defs/summarymap.def b/config-model/src/test/derived/music/defs/summarymap.def
new file mode 100644
index 00000000000..7bb5e7df849
--- /dev/null
+++ b/config-model/src/test/derived/music/defs/summarymap.def
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+
+## The default output summary class id, -1 to use the stored summary class id
+defaultoutputclass int default=-1
+
+## The name of the summary field which is overridden with a dynamic value
+override[].field string
+
+## The overriding command, one of:
+## staticrank, dynamicteaser, dynamicteasermetric, label, ranklog, empty, copy
+override[].command string
+
+## Space-seaparated arguments, dedendent on the given command
+override[].arguments string default=""
diff --git a/config-model/src/test/derived/music/ilscripts.cfg b/config-model/src/test/derived/music/ilscripts.cfg
new file mode 100644
index 00000000000..ca2c35ffcba
--- /dev/null
+++ b/config-model/src/test/derived/music/ilscripts.cfg
@@ -0,0 +1,76 @@
+maxtermoccurrences 100
+ilscript[0].doctype "music"
+ilscript[0].docfield[0] "bgndata"
+ilscript[0].docfield[1] "sales"
+ilscript[0].docfield[2] "pto"
+ilscript[0].docfield[3] "keys"
+ilscript[0].docfield[4] "mid"
+ilscript[0].docfield[5] "ew"
+ilscript[0].docfield[6] "surl"
+ilscript[0].docfield[7] "userrate"
+ilscript[0].docfield[8] "pid"
+ilscript[0].docfield[9] "weight"
+ilscript[0].docfield[10] "url"
+ilscript[0].docfield[11] "isbn"
+ilscript[0].docfield[12] "fmt"
+ilscript[0].docfield[13] "albumid"
+ilscript[0].docfield[14] "disp_song"
+ilscript[0].docfield[15] "song"
+ilscript[0].docfield[16] "pfrom"
+ilscript[0].docfield[17] "bgnpfrom"
+ilscript[0].docfield[18] "categories"
+ilscript[0].docfield[19] "data"
+ilscript[0].docfield[20] "numreview"
+ilscript[0].docfield[21] "bgnsellers"
+ilscript[0].docfield[22] "image"
+ilscript[0].docfield[23] "artist"
+ilscript[0].docfield[24] "artistspid"
+ilscript[0].docfield[25] "title"
+ilscript[0].docfield[26] "newestedition"
+ilscript[0].docfield[27] "bgnpto"
+ilscript[0].docfield[28] "year"
+ilscript[0].docfield[29] "did"
+ilscript[0].docfield[30] "scorekey"
+ilscript[0].docfield[31] "cbid"
+ilscript[0].docfield[32] "metalvalue"
+ilscript[0].docfield[33] "hiphopvalue"
+ilscript[0].docfield[34] "powermetalvalue"
+ilscript[0].docfield[35] "progvalue"
+ilscript[0].content[0] "clear_state | guard { input hiphopvalue | split \";\" | attribute hiphopvalue_arr; }"
+ilscript[0].content[1] "clear_state | guard { input metalvalue | split \";\" | attribute metalvalue_arr; }"
+ilscript[0].content[2] "clear_state | guard { input bgndata | tokenize normalize stem:\"SHORTEST\" | summary bgndata; }"
+ilscript[0].content[3] "clear_state | guard { input sales | summary sales | attribute sales; }"
+ilscript[0].content[4] "clear_state | guard { input pto | summary pto | attribute pto; }"
+ilscript[0].content[5] "clear_state | guard { input keys | tokenize normalize stem:\"SHORTEST\" | index keys; }"
+ilscript[0].content[6] "clear_state | guard { input mid | summary mid | attribute mid; }"
+ilscript[0].content[7] "clear_state | guard { input ew | tokenize normalize stem:\"SHORTEST\" | summary ew | index ew; }"
+ilscript[0].content[8] "clear_state | guard { input surl | summary surl; }"
+ilscript[0].content[9] "clear_state | guard { input userrate | summary userrate; }"
+ilscript[0].content[10] "clear_state | guard { input pid | summary pid; }"
+ilscript[0].content[11] "clear_state | guard { input weight | summary weight | attribute weight; }"
+ilscript[0].content[12] "clear_state | guard { input url | summary url; }"
+ilscript[0].content[13] "clear_state | guard { input isbn | summary isbn; }"
+ilscript[0].content[14] "clear_state | guard { input fmt | tokenize normalize stem:\"SHORTEST\" | summary fmt | index fmt; }"
+ilscript[0].content[15] "clear_state | guard { input albumid | summary albumid; }"
+ilscript[0].content[16] "clear_state | guard { input disp_song | summary disp_song; }"
+ilscript[0].content[17] "clear_state | guard { input song | tokenize normalize stem:\"SHORTEST\" | summary song | index song; }"
+ilscript[0].content[18] "clear_state | guard { input pfrom | summary pfrom; }"
+ilscript[0].content[19] "clear_state | guard { input bgnpfrom | summary bgnpfrom | attribute bgnpfrom; }"
+ilscript[0].content[20] "clear_state | guard { input categories | tokenize normalize stem:\"SHORTEST\" | summary categories | index categories; }"
+ilscript[0].content[21] "clear_state | guard { input data | summary data; }"
+ilscript[0].content[22] "clear_state | guard { input numreview | summary numreview; }"
+ilscript[0].content[23] "clear_state | guard { input bgnsellers | summary bgnsellers; }"
+ilscript[0].content[24] "clear_state | guard { input image | summary image; }"
+ilscript[0].content[25] "clear_state | guard { input artist | tokenize normalize stem:\"SHORTEST\" | summary artist | index artist; }"
+ilscript[0].content[26] "clear_state | guard { input artistspid | summary artistspid; }"
+ilscript[0].content[27] "clear_state | guard { input title | tokenize normalize stem:\"SHORTEST\" | summary title | index title; }"
+ilscript[0].content[28] "clear_state | guard { input newestedition | summary newestedition | attribute newestedition; }"
+ilscript[0].content[29] "clear_state | guard { input bgnpto | tokenize normalize stem:\"SHORTEST\" | summary bgnpto; }"
+ilscript[0].content[30] "clear_state | guard { input year | summary year | attribute year; }"
+ilscript[0].content[31] "clear_state | guard { input did | summary did | attribute did; }"
+ilscript[0].content[32] "clear_state | guard { input scorekey | summary scorekey; }"
+ilscript[0].content[33] "clear_state | guard { input cbid | summary cbid | attribute cbid; }"
+ilscript[0].content[34] "clear_state | guard { input metalvalue | summary metalvalue; }"
+ilscript[0].content[35] "clear_state | guard { input hiphopvalue | summary hiphopvalue; }"
+ilscript[0].content[36] "clear_state | guard { input powermetalvalue | tokenize normalize stem:\"SHORTEST\" | index powermetalvalue | summary powermetalvalue; }"
+ilscript[0].content[37] "clear_state | guard { input progvalue | tokenize normalize stem:\"SHORTEST\" | index progvalue | summary progvalue; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/music/index-info.cfg b/config-model/src/test/derived/music/index-info.cfg
new file mode 100644
index 00000000000..f7faae11ca8
--- /dev/null
+++ b/config-model/src/test/derived/music/index-info.cfg
@@ -0,0 +1,215 @@
+indexinfo[0].name "music"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "bgndata"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "sales"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "sales"
+indexinfo[0].command[4].command "attribute"
+indexinfo[0].command[5].indexname "sales"
+indexinfo[0].command[5].command "numerical"
+indexinfo[0].command[6].indexname "pto"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "pto"
+indexinfo[0].command[7].command "attribute"
+indexinfo[0].command[8].indexname "pto"
+indexinfo[0].command[8].command "numerical"
+indexinfo[0].command[9].indexname "keys"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "default"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "keys"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "default"
+indexinfo[0].command[12].command "lowercase"
+indexinfo[0].command[13].indexname "keys"
+indexinfo[0].command[13].command "stem:SHORTEST"
+indexinfo[0].command[14].indexname "default"
+indexinfo[0].command[14].command "stem:SHORTEST"
+indexinfo[0].command[15].indexname "keys"
+indexinfo[0].command[15].command "normalize"
+indexinfo[0].command[16].indexname "default"
+indexinfo[0].command[16].command "normalize"
+indexinfo[0].command[17].indexname "mid"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "mid"
+indexinfo[0].command[18].command "attribute"
+indexinfo[0].command[19].indexname "mid"
+indexinfo[0].command[19].command "numerical"
+indexinfo[0].command[20].indexname "surl"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "userrate"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "userrate"
+indexinfo[0].command[22].command "numerical"
+indexinfo[0].command[23].indexname "pid"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "weight"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "weight"
+indexinfo[0].command[25].command "attribute"
+indexinfo[0].command[26].indexname "weight"
+indexinfo[0].command[26].command "numerical"
+indexinfo[0].command[27].indexname "url"
+indexinfo[0].command[27].command "index"
+indexinfo[0].command[28].indexname "isbn"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "fmt"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "fmt"
+indexinfo[0].command[30].command "lowercase"
+indexinfo[0].command[31].indexname "fmt"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "fmt"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[33].indexname "albumid"
+indexinfo[0].command[33].command "index"
+indexinfo[0].command[34].indexname "disp_song"
+indexinfo[0].command[34].command "index"
+indexinfo[0].command[35].indexname "song"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "song"
+indexinfo[0].command[36].command "lowercase"
+indexinfo[0].command[37].indexname "song"
+indexinfo[0].command[37].command "stem:SHORTEST"
+indexinfo[0].command[38].indexname "song"
+indexinfo[0].command[38].command "normalize"
+indexinfo[0].command[39].indexname "pfrom"
+indexinfo[0].command[39].command "index"
+indexinfo[0].command[40].indexname "pfrom"
+indexinfo[0].command[40].command "numerical"
+indexinfo[0].command[41].indexname "bgnpfrom"
+indexinfo[0].command[41].command "index"
+indexinfo[0].command[42].indexname "bgnpfrom"
+indexinfo[0].command[42].command "attribute"
+indexinfo[0].command[43].indexname "bgnpfrom"
+indexinfo[0].command[43].command "numerical"
+indexinfo[0].command[44].indexname "categories"
+indexinfo[0].command[44].command "index"
+indexinfo[0].command[45].indexname "categories"
+indexinfo[0].command[45].command "lowercase"
+indexinfo[0].command[46].indexname "categories"
+indexinfo[0].command[46].command "stem:SHORTEST"
+indexinfo[0].command[47].indexname "categories"
+indexinfo[0].command[47].command "normalize"
+indexinfo[0].command[48].indexname "data"
+indexinfo[0].command[48].command "index"
+indexinfo[0].command[49].indexname "numreview"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "numreview"
+indexinfo[0].command[50].command "numerical"
+indexinfo[0].command[51].indexname "bgnsellers"
+indexinfo[0].command[51].command "index"
+indexinfo[0].command[52].indexname "bgnsellers"
+indexinfo[0].command[52].command "numerical"
+indexinfo[0].command[53].indexname "image"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "artist"
+indexinfo[0].command[54].command "index"
+indexinfo[0].command[55].indexname "artist"
+indexinfo[0].command[55].command "lowercase"
+indexinfo[0].command[56].indexname "artist"
+indexinfo[0].command[56].command "stem:SHORTEST"
+indexinfo[0].command[57].indexname "artist"
+indexinfo[0].command[57].command "normalize"
+indexinfo[0].command[58].indexname "artistspid"
+indexinfo[0].command[58].command "index"
+indexinfo[0].command[59].indexname "title"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "title"
+indexinfo[0].command[60].command "lowercase"
+indexinfo[0].command[61].indexname "title"
+indexinfo[0].command[61].command "stem:SHORTEST"
+indexinfo[0].command[62].indexname "title"
+indexinfo[0].command[62].command "normalize"
+indexinfo[0].command[63].indexname "newestedition"
+indexinfo[0].command[63].command "index"
+indexinfo[0].command[64].indexname "newestedition"
+indexinfo[0].command[64].command "attribute"
+indexinfo[0].command[65].indexname "newestedition"
+indexinfo[0].command[65].command "numerical"
+indexinfo[0].command[66].indexname "bgnpto"
+indexinfo[0].command[66].command "index"
+indexinfo[0].command[67].indexname "year"
+indexinfo[0].command[67].command "index"
+indexinfo[0].command[68].indexname "year"
+indexinfo[0].command[68].command "attribute"
+indexinfo[0].command[69].indexname "year"
+indexinfo[0].command[69].command "numerical"
+indexinfo[0].command[70].indexname "did"
+indexinfo[0].command[70].command "index"
+indexinfo[0].command[71].indexname "did"
+indexinfo[0].command[71].command "attribute"
+indexinfo[0].command[72].indexname "did"
+indexinfo[0].command[72].command "numerical"
+indexinfo[0].command[73].indexname "scorekey"
+indexinfo[0].command[73].command "index"
+indexinfo[0].command[74].indexname "scorekey"
+indexinfo[0].command[74].command "numerical"
+indexinfo[0].command[75].indexname "cbid"
+indexinfo[0].command[75].command "index"
+indexinfo[0].command[76].indexname "cbid"
+indexinfo[0].command[76].command "attribute"
+indexinfo[0].command[77].indexname "cbid"
+indexinfo[0].command[77].command "numerical"
+indexinfo[0].command[78].indexname "metalvalue"
+indexinfo[0].command[78].command "index"
+indexinfo[0].command[79].indexname "hiphopvalue"
+indexinfo[0].command[79].command "index"
+indexinfo[0].command[80].indexname "powermetalvalue"
+indexinfo[0].command[80].command "index"
+indexinfo[0].command[81].indexname "powermetalvalue"
+indexinfo[0].command[81].command "lowercase"
+indexinfo[0].command[82].indexname "powermetalvalue"
+indexinfo[0].command[82].command "stem:SHORTEST"
+indexinfo[0].command[83].indexname "powermetalvalue"
+indexinfo[0].command[83].command "normalize"
+indexinfo[0].command[84].indexname "progvalue"
+indexinfo[0].command[84].command "index"
+indexinfo[0].command[85].indexname "progvalue"
+indexinfo[0].command[85].command "lowercase"
+indexinfo[0].command[86].indexname "progvalue"
+indexinfo[0].command[86].command "stem:SHORTEST"
+indexinfo[0].command[87].indexname "progvalue"
+indexinfo[0].command[87].command "normalize"
+indexinfo[0].command[88].indexname "hiphopvalue_arr"
+indexinfo[0].command[88].command "index"
+indexinfo[0].command[89].indexname "hiphopvalue_arr"
+indexinfo[0].command[89].command "multivalue"
+indexinfo[0].command[90].indexname "hiphopvalue_arr"
+indexinfo[0].command[90].command "attribute"
+indexinfo[0].command[91].indexname "hiphopvalue_arr"
+indexinfo[0].command[91].command "word"
+indexinfo[0].command[92].indexname "metalvalue_arr"
+indexinfo[0].command[92].command "index"
+indexinfo[0].command[93].indexname "metalvalue_arr"
+indexinfo[0].command[93].command "multivalue"
+indexinfo[0].command[94].indexname "metalvalue_arr"
+indexinfo[0].command[94].command "attribute"
+indexinfo[0].command[95].indexname "metalvalue_arr"
+indexinfo[0].command[95].command "word"
+indexinfo[0].command[96].indexname "rankfeatures"
+indexinfo[0].command[96].command "index"
+indexinfo[0].command[97].indexname "summaryfeatures"
+indexinfo[0].command[97].command "index"
+indexinfo[0].command[98].indexname "bgndata"
+indexinfo[0].command[98].command "dynteaser"
+indexinfo[0].command[29].indexname "ew"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "ew"
+indexinfo[0].command[30].command "lowercase"
+indexinfo[0].command[31].indexname "ew"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "ew"
+indexinfo[0].command[102].indexname "ew"
+indexinfo[0].command[102].command "highlight"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[100].indexname "song"
+indexinfo[0].command[100].command "dynteaser"
+indexinfo[0].command[101].indexname "bgnpto"
+indexinfo[0].command[101].command "dynteaser"
+indexinfo[0].command[102].indexname "bgnpto"
+indexinfo[0].command[102].command "highlight" \ No newline at end of file
diff --git a/config-model/src/test/derived/music/juniperrc.cfg b/config-model/src/test/derived/music/juniperrc.cfg
new file mode 100755
index 00000000000..b5d7438e081
--- /dev/null
+++ b/config-model/src/test/derived/music/juniperrc.cfg
@@ -0,0 +1,21 @@
+length 256
+max_matches 3
+min_length 128
+prefix true
+surround_max 128
+winsize 200
+winsize_fallback_multiplier 10.0
+max_match_candidates 1000
+stem_min_length 5
+stem_max_extend 3
+override[0].fieldname "ew"
+override[0].length 65536
+override[0].max_matches 1
+override[0].min_length 8192
+override[0].prefix true
+override[0].surround_max 65536
+override[0].winsize 200
+override[0].winsize_fallback_multiplier 10.0
+override[0].max_match_candidates 1000
+override[0].stem_min_length 5
+override[0].stem_max_extend 3 \ No newline at end of file
diff --git a/config-model/src/test/derived/music/music.sd b/config-model/src/test/derived/music/music.sd
new file mode 100644
index 00000000000..b1a2bfc385d
--- /dev/null
+++ b/config-model/src/test/derived/music/music.sd
@@ -0,0 +1,176 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search music {
+
+ document music {
+
+ field bgndata type string {
+ indexing: summary
+ summary: dynamic
+ }
+
+ field sales type int {
+ indexing: summary | attribute
+ }
+
+ field pto type int {
+ indexing: summary | attribute
+ }
+
+ field keys type string {
+ indexing: index
+ }
+
+ field mid type int {
+ indexing: summary | attribute
+ }
+
+ field ew type string {
+ indexing: summary | index
+ bolding: on
+ }
+
+ field surl type string {
+ indexing: summary
+ }
+
+ field userrate type int {
+ indexing: summary
+ }
+
+ field pid type string {
+ indexing: summary
+ }
+
+ field weight type float {
+ indexing: summary | attribute
+ }
+
+ field url type string {
+ indexing: summary
+ }
+
+ field isbn type string {
+ indexing: summary
+ }
+
+ field fmt type string {
+ indexing: summary | index
+ }
+
+ field albumid type string {
+ indexing: summary
+ }
+
+ field disp_song type string {
+ indexing: summary
+ }
+
+ field song type string {
+ indexing: summary | index
+ summary: dynamic
+ }
+
+ field pfrom type int {
+ indexing: summary
+ }
+
+ field bgnpfrom type float {
+ indexing: summary | attribute
+ }
+
+ field categories type string {
+ indexing: summary | index
+ }
+
+ field data type string {
+ indexing: summary
+ }
+
+ field numreview type int {
+ indexing: summary
+ }
+
+ field bgnsellers type int {
+ indexing: summary
+ }
+
+ field image type string {
+ indexing: summary
+ }
+
+ field artist type string {
+ indexing: summary | index
+ }
+
+ field artistspid type string {
+ indexing: summary
+ }
+
+ field title type string {
+ indexing: summary | index
+ }
+
+ field newestedition type int {
+ indexing: summary | attribute
+ }
+
+ field bgnpto type string {
+ indexing: summary
+ summary: dynamic
+ bolding: on
+ }
+
+ field year type int {
+ indexing: summary | attribute
+ }
+
+ field did type int {
+ indexing: summary | attribute
+ }
+
+ field scorekey type int {
+ indexing: summary
+ }
+
+ field cbid type int {
+ indexing: summary | attribute
+ }
+
+ field metalvalue type string {
+ indexing: summary
+ }
+
+ field hiphopvalue type string {
+ indexing: summary
+ match {
+ token
+ }
+ }
+
+ field powermetalvalue type string {
+ indexing: index | summary
+ rank: filter
+ }
+
+ field progvalue type string {
+ indexing: index | summary
+ rank {
+ filter
+ }
+ }
+ }
+
+ field metalvalue_arr type array<string> {
+ indexing: input metalvalue | split ";" | attribute
+ }
+
+ field hiphopvalue_arr type array<string> {
+ indexing: input hiphopvalue | split ";" | attribute
+ }
+
+ fieldset default {
+ fields: keys, ew, artist, song, title
+ }
+
+}
+
diff --git a/config-model/src/test/derived/music/rank-profiles.cfg b/config-model/src/test/derived/music/rank-profiles.cfg
new file mode 100644
index 00000000000..e2452a670a0
--- /dev/null
+++ b/config-model/src/test/derived/music/rank-profiles.cfg
@@ -0,0 +1,34 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.powermetalvalue"
+rankprofile[0].fef.property[0].value "linear(0,0)"
+rankprofile[0].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.powermetalvalue"
+rankprofile[0].fef.property[1].value "linear(0,0)"
+rankprofile[0].fef.property[2].name "nativeProximity.proximityTable.powermetalvalue"
+rankprofile[0].fef.property[2].value "linear(0,0)"
+rankprofile[0].fef.property[3].name "nativeProximity.reverseProximityTable.powermetalvalue"
+rankprofile[0].fef.property[3].value "linear(0,0)"
+rankprofile[0].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.progvalue"
+rankprofile[0].fef.property[4].value "linear(0,0)"
+rankprofile[0].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.progvalue"
+rankprofile[0].fef.property[5].value "linear(0,0)"
+rankprofile[0].fef.property[6].name "nativeProximity.proximityTable.progvalue"
+rankprofile[0].fef.property[6].value "linear(0,0)"
+rankprofile[0].fef.property[7].name "nativeProximity.reverseProximityTable.progvalue"
+rankprofile[0].fef.property[7].value "linear(0,0)"
+rankprofile[0].fef.property[9].name "vespa.isfilterfield.progvalue"
+rankprofile[0].fef.property[9].value "true"
+rankprofile[0].fef.property[10].name "vespa.isfilterfield.powermetalvalue"
+rankprofile[0].fef.property[10].value "true"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[1].fef.property[5].name "vespa.isfilterfield.progvalue"
+rankprofile[1].fef.property[5].value "true"
+rankprofile[1].fef.property[6].name "vespa.isfilterfield.powermetalvalue"
+rankprofile[1].fef.property[6].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/music/summary.cfg b/config-model/src/test/derived/music/summary.cfg
new file mode 100644
index 00000000000..0ddb8940482
--- /dev/null
+++ b/config-model/src/test/derived/music/summary.cfg
@@ -0,0 +1,103 @@
+defaultsummaryid 2086497905
+classes[0].id 2086497905
+classes[0].name "default"
+classes[0].fields[0].name "bgndata"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "sales"
+classes[0].fields[1].type "integer"
+classes[0].fields[2].name "pto"
+classes[0].fields[2].type "integer"
+classes[0].fields[3].name "mid"
+classes[0].fields[3].type "integer"
+classes[0].fields[4].name "ew"
+classes[0].fields[4].type "longstring"
+classes[0].fields[5].name "surl"
+classes[0].fields[5].type "longstring"
+classes[0].fields[6].name "userrate"
+classes[0].fields[6].type "integer"
+classes[0].fields[7].name "pid"
+classes[0].fields[7].type "longstring"
+classes[0].fields[8].name "weight"
+classes[0].fields[8].type "float"
+classes[0].fields[9].name "url"
+classes[0].fields[9].type "longstring"
+classes[0].fields[10].name "isbn"
+classes[0].fields[10].type "longstring"
+classes[0].fields[11].name "fmt"
+classes[0].fields[11].type "longstring"
+classes[0].fields[12].name "albumid"
+classes[0].fields[12].type "longstring"
+classes[0].fields[13].name "disp_song"
+classes[0].fields[13].type "longstring"
+classes[0].fields[14].name "song"
+classes[0].fields[14].type "longstring"
+classes[0].fields[15].name "pfrom"
+classes[0].fields[15].type "integer"
+classes[0].fields[16].name "bgnpfrom"
+classes[0].fields[16].type "float"
+classes[0].fields[17].name "categories"
+classes[0].fields[17].type "longstring"
+classes[0].fields[18].name "data"
+classes[0].fields[18].type "longstring"
+classes[0].fields[19].name "numreview"
+classes[0].fields[19].type "integer"
+classes[0].fields[20].name "bgnsellers"
+classes[0].fields[20].type "integer"
+classes[0].fields[21].name "image"
+classes[0].fields[21].type "longstring"
+classes[0].fields[22].name "artist"
+classes[0].fields[22].type "longstring"
+classes[0].fields[23].name "artistspid"
+classes[0].fields[23].type "longstring"
+classes[0].fields[24].name "title"
+classes[0].fields[24].type "longstring"
+classes[0].fields[25].name "newestedition"
+classes[0].fields[25].type "integer"
+classes[0].fields[26].name "bgnpto"
+classes[0].fields[26].type "longstring"
+classes[0].fields[27].name "year"
+classes[0].fields[27].type "integer"
+classes[0].fields[28].name "did"
+classes[0].fields[28].type "integer"
+classes[0].fields[29].name "scorekey"
+classes[0].fields[29].type "integer"
+classes[0].fields[30].name "cbid"
+classes[0].fields[30].type "integer"
+classes[0].fields[31].name "metalvalue"
+classes[0].fields[31].type "longstring"
+classes[0].fields[32].name "hiphopvalue"
+classes[0].fields[32].type "longstring"
+classes[0].fields[33].name "powermetalvalue"
+classes[0].fields[33].type "longstring"
+classes[0].fields[34].name "progvalue"
+classes[0].fields[34].type "longstring"
+classes[0].fields[35].name "rankfeatures"
+classes[0].fields[35].type "featuredata"
+classes[0].fields[36].name "summaryfeatures"
+classes[0].fields[36].type "featuredata"
+classes[0].fields[37].name "documentid"
+classes[0].fields[37].type "longstring"
+classes[1].id 2060710706
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "sales"
+classes[1].fields[0].type "integer"
+classes[1].fields[1].name "pto"
+classes[1].fields[1].type "integer"
+classes[1].fields[2].name "mid"
+classes[1].fields[2].type "integer"
+classes[1].fields[3].name "weight"
+classes[1].fields[3].type "float"
+classes[1].fields[4].name "bgnpfrom"
+classes[1].fields[4].type "float"
+classes[1].fields[5].name "newestedition"
+classes[1].fields[5].type "integer"
+classes[1].fields[6].name "year"
+classes[1].fields[6].type "integer"
+classes[1].fields[7].name "did"
+classes[1].fields[7].type "integer"
+classes[1].fields[8].name "cbid"
+classes[1].fields[8].type "integer"
+classes[1].fields[9].name "rankfeatures"
+classes[1].fields[9].type "featuredata"
+classes[1].fields[10].name "summaryfeatures"
+classes[1].fields[10].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/music/summarymap.cfg b/config-model/src/test/derived/music/summarymap.cfg
new file mode 100644
index 00000000000..f86dd8ec98f
--- /dev/null
+++ b/config-model/src/test/derived/music/summarymap.cfg
@@ -0,0 +1,46 @@
+defaultoutputclass -1
+override[0].field "bgndata"
+override[0].command "dynamicteaser"
+override[0].arguments "bgndata"
+override[1].field "sales"
+override[1].command "attribute"
+override[1].arguments "sales"
+override[2].field "pto"
+override[2].command "attribute"
+override[2].arguments "pto"
+override[3].field "mid"
+override[3].command "attribute"
+override[3].arguments "mid"
+override[4].field "ew"
+override[4].command "dynamicteaser"
+override[4].arguments "ew"
+override[5].field "weight"
+override[5].command "attribute"
+override[5].arguments "weight"
+override[6].field "song"
+override[6].command "dynamicteaser"
+override[6].arguments "song"
+override[7].field "bgnpfrom"
+override[7].command "attribute"
+override[7].arguments "bgnpfrom"
+override[8].field "newestedition"
+override[8].command "attribute"
+override[8].arguments "newestedition"
+override[9].field "bgnpto"
+override[9].command "dynamicteaser"
+override[9].arguments "bgnpto"
+override[10].field "year"
+override[10].command "attribute"
+override[10].arguments "year"
+override[11].field "did"
+override[11].command "attribute"
+override[11].arguments "did"
+override[12].field "cbid"
+override[12].command "attribute"
+override[12].arguments "cbid"
+override[13].field "rankfeatures"
+override[13].command "rankfeatures"
+override[13].arguments ""
+override[14].field "summaryfeatures"
+override[14].command "summaryfeatures"
+override[14].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/music3/music3.sd b/config-model/src/test/derived/music3/music3.sd
new file mode 100644
index 00000000000..e1c78406234
--- /dev/null
+++ b/config-model/src/test/derived/music3/music3.sd
@@ -0,0 +1,70 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search music3 {
+
+ document music3 {
+
+ field title type string {
+ indexing: summary | index
+ # index-to: title, default
+ rank-type: about
+
+ header
+ }
+
+ field artist type string {
+ indexing: summary | attribute | index
+ # index-to: artist, default
+ rank-type:about
+
+ header
+ }
+
+ field year type int {
+ indexing: summary | attribute
+
+ header
+ }
+
+ # Increase rank score of popular documents regardless of query
+ field popularity type int {
+ indexing: summary | attribute
+
+ header
+ }
+
+ field url type uri {
+ indexing: summary | index
+
+ header
+ }
+
+ }
+
+ rank-profile other {
+
+ first-phase {
+ expression: nativeRank
+ }
+
+ second-phase {
+ expression: 0.5 * 0.5 * (0.1 * attribute(popularity) + fieldMatch(artist)) + 0.3 * fieldMatch(title)
+ rerank-count:200
+ }
+ }
+
+ rank-profile default {
+
+ first-phase {
+ expression: nativeRank
+ }
+
+ second-phase {
+ expression {
+ 0.5 * 0.5 * (0.1 * attribute(popularity) + fieldMatch(artist))
+ + 0.3 * fieldMatch(title)
+ }
+ rerank-count:200
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/newrank/attributes.cfg b/config-model/src/test/derived/newrank/attributes.cfg
new file mode 100644
index 00000000000..536e07ac13c
--- /dev/null
+++ b/config-model/src/test/derived/newrank/attributes.cfg
@@ -0,0 +1,190 @@
+attribute[0].name "sales"
+attribute[0].datatype INT32
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "pto"
+attribute[1].datatype INT32
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "mid"
+attribute[2].datatype INT32
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "weight"
+attribute[3].datatype FLOAT
+attribute[3].collectiontype SINGLE
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "bgnpfrom"
+attribute[4].datatype FLOAT
+attribute[4].collectiontype SINGLE
+attribute[4].removeifzero false
+attribute[4].createifnonexistent false
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "newestedition"
+attribute[5].datatype INT32
+attribute[5].collectiontype SINGLE
+attribute[5].removeifzero false
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "year"
+attribute[6].datatype INT32
+attribute[6].collectiontype SINGLE
+attribute[6].removeifzero false
+attribute[6].createifnonexistent false
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "did"
+attribute[7].datatype INT32
+attribute[7].collectiontype SINGLE
+attribute[7].removeifzero false
+attribute[7].createifnonexistent false
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "scorekey"
+attribute[8].datatype INT32
+attribute[8].collectiontype SINGLE
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch false
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype ""
+attribute[9].name "cbid"
+attribute[9].datatype INT32
+attribute[9].collectiontype SINGLE
+attribute[9].removeifzero false
+attribute[9].createifnonexistent false
+attribute[9].fastsearch false
+attribute[9].huge false
+attribute[9].sortascending true
+attribute[9].sortfunction UCA
+attribute[9].sortstrength PRIMARY
+attribute[9].sortlocale ""
+attribute[9].enablebitvectors false
+attribute[9].enableonlybitvector false
+attribute[9].fastaccess false
+attribute[9].arity 8
+attribute[9].lowerbound -9223372036854775808
+attribute[9].upperbound 9223372036854775807
+attribute[9].densepostinglistthreshold 0.4
+attribute[9].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/newrank/defs/attributes.def b/config-model/src/test/derived/newrank/defs/attributes.def
new file mode 100644
index 00000000000..bb3a0df6299
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/attributes.def
@@ -0,0 +1,7 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+attribute[].name string
+attribute[].datatype string
+attribute[].multivalue bool default=false
+attribute[].sortsigned bool default=true
+attribute[].disableprep bool default=false
diff --git a/config-model/src/test/derived/newrank/defs/documentmanager.def b/config-model/src/test/derived/newrank/defs/documentmanager.def
new file mode 100644
index 00000000000..a310e9f13c8
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/documentmanager.def
@@ -0,0 +1,12 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=document.config
+datatype[].id int
+datatype[].arraytype[].datatype int
+documenttype[].name string
+documenttype[].version int
+documenttype[].inherits[].name string
+documenttype[].inherits[].version int
+documenttype[].field[].name string
+documenttype[].field[].id int
+documenttype[].field[].header bool
+documenttype[].field[].datatype int
diff --git a/config-model/src/test/derived/newrank/defs/extra.def b/config-model/src/test/derived/newrank/defs/extra.def
new file mode 100644
index 00000000000..cc03f1b39d3
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/extra.def
@@ -0,0 +1,4 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=test
+file[].name string
+file[].content string
diff --git a/config-model/src/test/derived/newrank/defs/ilscripts.def b/config-model/src/test/derived/newrank/defs/ilscripts.def
new file mode 100644
index 00000000000..d999742fa3c
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/ilscripts.def
@@ -0,0 +1,5 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.configdefinition
+ilscript[].name string
+ilscript[].doctype string
+ilscript[].content[] string
diff --git a/config-model/src/test/derived/newrank/defs/rank-profiles.def b/config-model/src/test/derived/newrank/defs/rank-profiles.def
new file mode 100644
index 00000000000..0d7cf27ff06
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/rank-profiles.def
@@ -0,0 +1,344 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+## name of this rank profile. maps to table index for internal use.
+rankprofile[].name string
+
+## the name of a generic property available to the feature execution framework and feature plugins
+rankprofile[].fef.property[].name string
+
+## the value of a generic property available to feature plugins
+rankprofile[].fef.property[].value string
+
+## the catalog name overrides apply to
+rankprofile[].catalog[].name string
+
+## Boost value for AND queries in this catalog.
+rankprofile[].catalog[].andboost int default=0
+
+## Boost value for OR queries in this catalog.
+rankprofile[].catalog[].orboost int default=0
+
+## Boost value for ANY queries in this catalog.
+rankprofile[].catalog[].anyboost int default=0
+
+## Boost value for NEAR queries in catalog.
+rankprofile[].catalog[].nearboost int default=0
+
+## Boost value for ORDEREDNEAR queries in this catalog.
+rankprofile[].catalog[].orderednearboost int default=0
+
+## Boost value for phrase queries in this catalog.
+rankprofile[].catalog[].phraseboost int default=0
+
+## Boost value for all queries in catalog.
+rankprofile[].catalog[].rankboost int default=0
+
+## If true, the context boost is the max value of
+## the individual contextboosts.
+## When false, the context boost when a term is in
+## several contexts is the sum of the individual contextboosts.
+rankprofile[].catalog[].bestcontextboostonly bool default=false
+
+
+## If true, then use extnumoccboost only when calculating rank values.
+## Also, do not normalize the extnumoccboost value with
+## global term frequency. Default value is false.
+rankprofile[].catalog[].extnumoccboostonly bool default=false
+
+## If yes, then use extnumoccboost only when calculating rank values.
+## Also, do not normalize the extnumoccboost value with
+## global term frequency. Default value is no.
+rankprofile[].catalog[].numoccandextnumoccboostonly bool default=false
+
+## If yes, then use bitvectors when possible.
+## Default value is false.
+rankprofile[].catalog[].preferbitvector bool default=false
+
+## Load extnumoccboost for this catalog from the named file.
+## extnumoccboost specifies boost values due to the number of
+## occurences of a term that are external to the document. If
+## "NULL" is given as file name, then all extnumoccboost values
+## will be set to 0.
+rankprofile[].catalog[].extnumoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load numoccboost for this catalog from the named file.
+## numoccboost specifies boost values due to the number of occurences in
+## a document. If "NULL" is given as file name, then all numoccboost
+## values will be set to 0.
+rankprofile[].catalog[].numoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load firstoccboost for catalog from the file named.
+## firstoccboost specifies boost values due to the position of the
+## first occurence in a document. If "NULL" is given as file name,
+## then all firstoccboost values will be set to 0.
+rankprofile[].catalog[].firstoccboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+
+## Load firstoccproximityboost for this catalog from the file named.
+## firstoccproximity boost specifies boost values due to the correlation between
+## positions of the first occurence in a document for two and two words.
+##
+## If "NULL" is given as file name, then all
+## firstoccproximityboost values will be set to 0. If otherwise set,
+## should be the name of a file to load into the table. The file
+## should have 256 lines each containing a single integer.
+##
+## There are 256 elements in the table, handling forward distances from 1.
+## The corresponding firstoccrevproximityboost table is used
+## to handle closeness in reverse order.
+##
+## The last array index specifies the proximity table set. During
+## evaluation, the bigram proximity weight supplied by the query segmenter
+## specifies which proximity table set to use, with a fallback to set 0
+## when no information is available.
+rankprofile[].catalog[].firstoccproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load firstoccrevproximityboost table for this catalog from the named file.
+## Specifies boost values due to the correlation between positions
+## of the first occurence in a document for two and two words when
+## the second word in the query comes first in the document.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].firstoccrevproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load proximityboost for this catalog from the named file.
+## proximity boost specifies boost values due to the correlation between
+## positions of the occurences in a document for two and two words.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].proximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load revproximityboost for this catalog from the named file.
+## revproximity boost specifies boost values due to the correlation between
+## positions of the occurences in a document for two and two words.
+## See also firstoccproximityboost above.
+rankprofile[].catalog[].revproximityboost[].table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## Load divtable for this catalog from the named file.
+## Rank values for a query term are divided by the entry
+## in divtable indexed by log2 of term frequence.
+## The file should contain ?? lines each with a single integer.
+rankprofile[].catalog[].divtable string default=""
+
+## The name of a context in this catalog to specify boosts for.
+rankprofile[].catalog[].context[].name string
+
+## Boost occurrences in this context with the given value.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].contextboost int default=0
+
+## Boost pair of occurrences in this context with
+## the given value when evaluating 2 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.pair int default=0
+
+## Boost triple of occurrences in this context with
+## the given value when evaluating 3 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.triple int default=0
+
+## Boost quad of occurrences in this context with
+## the given value when evaluating 4 words from same catalog in
+## parallell.
+## XXX -1 uses default (???) from somewhere(TM).
+rankprofile[].catalog[].context[].commoncontextboost.quad int default=0
+
+
+## The name of the attribute
+rankprofile[].attribute[].name string
+
+## Boost value for queries that hit in this attribute
+rankprofile[].attribute[].attributecontextboost int default=0
+
+## Load weightboost for this attribute from the named file.
+## weightboost specifies boost values due to the weight (weighted set)
+## or number of occurences (single, array) in an attribute.
+## If "NULL" is given as file name, then all weightboost values will be set to 0.
+rankprofile[].attribute[].weightboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+
+## Load static rank values from the given staticrank docattr vector.
+## Must be specified in index.cf as a staticrankfile.
+rankprofile[].staticrankfile string default=""
+
+## Multiply static rank values with given value when calculating total
+## rank value.
+rankprofile[].staticcoefficient int default=1
+
+## If false then use only static ranking when sorting result hits.
+## Default is true.
+rankprofile[].dynamicranking bool default=true
+
+## If dynamic ranking is turned off, then ascending will sort the
+## result hits with lowest static rank values first, while
+## descending will sort with highest static rank values
+## first. Default is descending. This keyword has no effect if
+## dynamic ranking is on.
+rankprofile[].staticranksortorder string default="descending"
+
+## Load static rank mapping from the file named table. The static
+## rank mapping maps each 8-bit static rank value into a 32-bit static
+## rank value. This option may only be used with 8-bit static rank files.
+rankprofile[].staticrankmap string default=""
+
+## If set to "true", total rank will be reduced when dynamic rank is less than
+## 25% of static rank, to suppress irrelevant hits from popular sites.
+## If set to "false", total rank is not reduced.
+rankprofile[].clampstaticrank bool default=false
+
+## Load document datetime values used for freshness boost calculation from
+## this file. The values must be coded as minutes since
+## 1900-01-01T00:00Z. The value 0 has the special meaning
+## "no datetime value exists".
+rankprofile[].freshnessboost.file string default=""
+
+## Load freshnessboost lookup-table values from the file named
+## table instead of using built-in default values. The file must
+## contain 32 white-space separated non-negative integers.
+rankprofile[].freshnessboost.table string default="/home/vespa/conf/vespa/search/ranktables/constant-0000"
+
+## When calculating the freshness boost value multiply difference between
+## current datetime and document datetime with timeoffset before taking
+## the base-2 logarithm. Default value is 1. Max value is 31.
+rankprofile[].freshnessboost.timeoffset int default=1
+
+## If a document has datetime value 0, then use defaultboostvalue
+## as freshness boost value instead of doing table lookup. The default
+## default value is 0 (no boost).
+rankprofile[].freshnessboost.defaultboostvalue int default=0
+
+## Multiply freshness boost value with coefficient when calculating
+## total freshness boost value. If coefficient 0 is used, no freshness
+## boost value will be computed or added. Default value is 0.
+rankprofile[].freshnessboost.coefficient int default=0
+
+## boost table files for distance ranking, 1 dimension.
+## The tables have 465 elements each, where slots 0..15 represents
+## distances 0..15 while the remaining slots represents distance
+## (16 + (slot & 15)) << ((slot >> 4) - 1). Linear interpolation is
+## used for distances "between" table slots.
+##
+## If "NULL" is given as the file name then all 1D distance boost values
+## for that table will be set to 0.
+rankprofile[].distance1dboosttable[].table string
+
+## boost table files for distance ranking, 2 dimensions.
+## The tables have 977 elements each, where slots 0..15 represents
+## square of distance being 0..15 while the remaining slots represents
+## square of distance distance being
+## (16 + (slot & 15)) << ((slot >> 4) - 1). Linear interpolation is
+## used for distances "between" table slots.
+##
+## If "NULL" is given as the file name then all 2D distance boost values
+## for that table will be set to 0.
+rankprofile[].distance2dboosttable[].table string
+
+## The lowest possible size of a ranked result. This is the lower ramp
+## of the percentage specified in the binsize variable. The default is
+## specified in fsearchrc.
+rankprofile[].binlow int default=-1
+
+## The high limit of the ranked result bin. If the percentage of the
+## resultset specified in binsize is higher than this limit, this will be
+## the max size. The default is specified in fsearchrc.
+rankprofile[].binhigh int default=-1
+
+## The size of the ranked results as a percentage of the total result
+## set size. The percentage can be ramped off with the binlow and binhigh
+## variables. The default is specified in fsearchrc.
+rankprofile[].binsize double default=-1
+
+## Minimum value for maximum value of number of 'posocc' entries for a word.
+## The default is specified in fsearchrc.
+rankprofile[].posbinlow int default=-1
+
+## Maximum value for maximum value of number of 'posocc' entries for a word.
+## The default is specified in fsearchrc.
+rankprofile[].posbinhigh int default=-1
+
+## The maximum value for number of 'posocc' entries for a word, specified
+## as a percentage of the number of documents in the index. If more
+## entries are needed for evaluation, posocc entries are not used for that
+## word and evaluation will be performed without full proximity support.
+## The percentage can be ramped off with the posbinlow and posbinhigh
+## variables. The default is specified in fsearchrc.
+rankprofile[].posbinsize int default=-1
+
+## Boost value that is added to the relevance score of hits from superior
+## searches (searches where recall is sacrificed for better
+## precision). The rank cutoff feature will not be affected by this
+## feature (rank cutoff is applied before the superior boost).
+rankprofile[].superiorboost int default=0
+
+## Name of rank profile to be used when running superior searches
+## (searches where recall is sacrificed for better precision). If not
+## set, the current ranking profile will be used.
+##
+## If a profile for a superior search has this set then a superior^2
+## search exist (with more recall sacrificed than for superior searches)
+## and search behavior is slightly changed:
+##
+## If the search node has been asked to perform a superior search then an
+## internal double fallthrough with (superior, superior^2) search is
+## performed. If the search node has been asked to perform an internal
+## double fallthrough then a triple fallthrough with (normal, superior,
+## superior^2) is performed.
+rankprofile[].superiorname string default=""
+
+## After all other rank calculations, the rank value is tuned according
+## to the tunefactor and tunebias values. The rank value is modified
+## as follows: new_rank = old_rank * tunefactor + tunebias.
+rankprofile[].tunefactor double default=1.0
+
+## After all other rank calculations, the rank value is tuned according
+## to the tunefactor and tunebias values. The rank value is modified
+## as follows: new_rank = old_rank * tunefactor + tunebias.
+rankprofile[].tunebias int default=0
+
+## A lower limit for the rankvalue of the results returned from the
+## search node. If rankcutoff.advanced is set to "true", determines
+## the constant value used in the internal advanced rank cutoff
+## calculations. This roughly reflects the expected rank contribution
+## of one good term.
+## The rankcutoff.val value and the rankcutoff.advanced parameter
+## may be used if you only want hits with a minimum relevancy to show
+## up in the resultset.
+## A value below zero means no rankcutoff is done.
+rankprofile[].rankcutoff.val int default=-1
+
+## When rankcutoff.val is in use, this flag controls whether to use
+## an internal calculation is used for determining the rank cutoff
+## value. If "false", use rankcutoff.val as a direct lower limit.
+rankprofile[].rankcutoff.advanced bool default=false
+
+## If set to "ON", use of posocc files is enabled, except when
+## "forceemptyposoccs" is set in fsearchrc or posocc files doesn't exist.
+## If set to "OFF", use of posocc files is disabled.
+## If "NOTSET" the fsearchrc "proximity" parameter is used instead.
+rankprofile[].proximity.full.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## If set to "ON", use of firstoccproximity is enabled.
+## If set to "OFF", use of firstoccproximity is disabled.
+## When NOTSET use the firstoccproximity value in fsearchrc configuration.
+rankprofile[].proximity.firstocc.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## If set to "ON", use of proximity (cf. proximity and firstoccproximity)
+## will affect phrases in addition to single words.
+## If set to "OFF", proximity is never used for phrases.
+## When NOTSET use the phraseproximity value in fsearchrc configuration.
+rankprofile[].proximity.phrase.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## Selects behavior when proximity can be used for two words but not three
+## words while firstoccproximity can be used for three words.
+## If set to "ON", then use proximity for two words.
+## If set to "OFF", then use firstoccproximity for three words.
+## When NOTSET use the proximitypairbeforefirstoccproximitytriple value
+## in fsearchrc configuration.
+rankprofile[].proximity.pairbeforefirstocctriple.enable enum { OFF, ON, NOTSET } default=NOTSET
+
+## Selects behavior when proximity can be used for three words but not four
+## words while firstoccproximity can be used for four words.
+## If set to "ON", then use proximity for three words.
+## If set to "OFF", then use firstoccproximity for four words.
+## When NOTSET use the proximitytriplebeforefirstoccproximityquad value
+rankprofile[].proximity.triplebeforefirstoccquad.enable enum { OFF, ON, NOTSET } default=NOTSET
diff --git a/config-model/src/test/derived/newrank/defs/summarymap.def b/config-model/src/test/derived/newrank/defs/summarymap.def
new file mode 100644
index 00000000000..31b8fc44b66
--- /dev/null
+++ b/config-model/src/test/derived/newrank/defs/summarymap.def
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+namespace=vespa.config.search
+## The default output summary class id, -1 to use the stored summary class id
+defaultoutputclass int default=-1
+
+## The name of the summary field which is overridden with a dynamic value
+override[].field string
+
+## The overriding command, one of:
+## staticrank, dynamicteaser, dynamicteasermetric, label, ranklog, empty, copy
+override[].command string
+
+## Space-seaparated arguments, dedendent on the given command
+override[].arguments string default=""
diff --git a/config-model/src/test/derived/newrank/ilscripts.cfg b/config-model/src/test/derived/newrank/ilscripts.cfg
new file mode 100644
index 00000000000..8a252be4dd0
--- /dev/null
+++ b/config-model/src/test/derived/newrank/ilscripts.cfg
@@ -0,0 +1,66 @@
+maxtermoccurrences 100
+ilscript[0].doctype "newrank"
+ilscript[0].docfield[0] "bgndata"
+ilscript[0].docfield[1] "sales"
+ilscript[0].docfield[2] "pto"
+ilscript[0].docfield[3] "keys"
+ilscript[0].docfield[4] "mid"
+ilscript[0].docfield[5] "ew"
+ilscript[0].docfield[6] "surl"
+ilscript[0].docfield[7] "userrate"
+ilscript[0].docfield[8] "pid"
+ilscript[0].docfield[9] "weight"
+ilscript[0].docfield[10] "url"
+ilscript[0].docfield[11] "isbn"
+ilscript[0].docfield[12] "fmt"
+ilscript[0].docfield[13] "albumid"
+ilscript[0].docfield[14] "disp_song"
+ilscript[0].docfield[15] "song"
+ilscript[0].docfield[16] "pfrom"
+ilscript[0].docfield[17] "bgnpfrom"
+ilscript[0].docfield[18] "categories"
+ilscript[0].docfield[19] "data"
+ilscript[0].docfield[20] "numreview"
+ilscript[0].docfield[21] "bgnsellers"
+ilscript[0].docfield[22] "image"
+ilscript[0].docfield[23] "artist"
+ilscript[0].docfield[24] "artistspid"
+ilscript[0].docfield[25] "title"
+ilscript[0].docfield[26] "newestedition"
+ilscript[0].docfield[27] "bgnpto"
+ilscript[0].docfield[28] "year"
+ilscript[0].docfield[29] "did"
+ilscript[0].docfield[30] "scorekey"
+ilscript[0].docfield[31] "cbid"
+ilscript[0].content[0] "clear_state | guard { input bgndata | tokenize normalize stem:\"SHORTEST\" | summary bgndata; }"
+ilscript[0].content[1] "clear_state | guard { input sales | summary sales | attribute sales; }"
+ilscript[0].content[2] "clear_state | guard { input pto | summary pto | attribute pto; }"
+ilscript[0].content[3] "clear_state | guard { input keys | tokenize normalize stem:\"SHORTEST\" | index keys; }"
+ilscript[0].content[4] "clear_state | guard { input mid | summary mid | attribute mid; }"
+ilscript[0].content[5] "clear_state | guard { input ew | tokenize normalize stem:\"SHORTEST\" | summary ew | index ew; }"
+ilscript[0].content[6] "clear_state | guard { input surl | summary surl; }"
+ilscript[0].content[7] "clear_state | guard { input userrate | summary userrate; }"
+ilscript[0].content[8] "clear_state | guard { input pid | summary pid; }"
+ilscript[0].content[9] "clear_state | guard { input weight | summary weight | attribute weight; }"
+ilscript[0].content[10] "clear_state | guard { input url | summary url; }"
+ilscript[0].content[11] "clear_state | guard { input isbn | summary isbn; }"
+ilscript[0].content[12] "clear_state | guard { input fmt | tokenize normalize stem:\"SHORTEST\" | summary fmt | index fmt; }"
+ilscript[0].content[13] "clear_state | guard { input albumid | summary albumid; }"
+ilscript[0].content[14] "clear_state | guard { input disp_song | summary disp_song; }"
+ilscript[0].content[15] "clear_state | guard { input song | tokenize normalize stem:\"SHORTEST\" | summary song | index song; }"
+ilscript[0].content[16] "clear_state | guard { input pfrom | summary pfrom; }"
+ilscript[0].content[17] "clear_state | guard { input bgnpfrom | summary bgnpfrom | attribute bgnpfrom; }"
+ilscript[0].content[18] "clear_state | guard { input categories | tokenize normalize stem:\"SHORTEST\" | summary categories | index categories; }"
+ilscript[0].content[19] "clear_state | guard { input data | summary data; }"
+ilscript[0].content[20] "clear_state | guard { input numreview | summary numreview; }"
+ilscript[0].content[21] "clear_state | guard { input bgnsellers | summary bgnsellers; }"
+ilscript[0].content[22] "clear_state | guard { input image | summary image; }"
+ilscript[0].content[23] "clear_state | guard { input artist | tokenize normalize stem:\"SHORTEST\" | summary artist | index artist; }"
+ilscript[0].content[24] "clear_state | guard { input artistspid | summary artistspid; }"
+ilscript[0].content[25] "clear_state | guard { input title | tokenize normalize stem:\"SHORTEST\" | summary title | index title; }"
+ilscript[0].content[26] "clear_state | guard { input newestedition | summary newestedition | attribute newestedition; }"
+ilscript[0].content[27] "clear_state | guard { input bgnpto | tokenize normalize stem:\"SHORTEST\" | summary bgnpto; }"
+ilscript[0].content[28] "clear_state | guard { input year | summary year | attribute year; }"
+ilscript[0].content[29] "clear_state | guard { input did | summary did | attribute did; }"
+ilscript[0].content[30] "clear_state | guard { input scorekey | summary scorekey | attribute scorekey; }"
+ilscript[0].content[31] "clear_state | guard { input cbid | summary cbid | attribute cbid; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/newrank/index-info.cfg b/config-model/src/test/derived/newrank/index-info.cfg
new file mode 100644
index 00000000000..a74a7a3de08
--- /dev/null
+++ b/config-model/src/test/derived/newrank/index-info.cfg
@@ -0,0 +1,181 @@
+indexinfo[0].name "newrank"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "bgndata"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "sales"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "sales"
+indexinfo[0].command[4].command "attribute"
+indexinfo[0].command[5].indexname "sales"
+indexinfo[0].command[5].command "numerical"
+indexinfo[0].command[6].indexname "pto"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "pto"
+indexinfo[0].command[7].command "attribute"
+indexinfo[0].command[8].indexname "pto"
+indexinfo[0].command[8].command "numerical"
+indexinfo[0].command[9].indexname "keys"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "default"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "keys"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "default"
+indexinfo[0].command[12].command "lowercase"
+indexinfo[0].command[13].indexname "keys"
+indexinfo[0].command[13].command "stem:SHORTEST"
+indexinfo[0].command[14].indexname "default"
+indexinfo[0].command[14].command "stem:SHORTEST"
+indexinfo[0].command[15].indexname "keys"
+indexinfo[0].command[15].command "normalize"
+indexinfo[0].command[16].indexname "default"
+indexinfo[0].command[16].command "normalize"
+indexinfo[0].command[17].indexname "mid"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "mid"
+indexinfo[0].command[18].command "attribute"
+indexinfo[0].command[19].indexname "mid"
+indexinfo[0].command[19].command "numerical"
+indexinfo[0].command[20].indexname "surl"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "userrate"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "userrate"
+indexinfo[0].command[22].command "numerical"
+indexinfo[0].command[23].indexname "pid"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "weight"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "weight"
+indexinfo[0].command[25].command "attribute"
+indexinfo[0].command[26].indexname "weight"
+indexinfo[0].command[26].command "numerical"
+indexinfo[0].command[27].indexname "url"
+indexinfo[0].command[27].command "index"
+indexinfo[0].command[28].indexname "isbn"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "fmt"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "fmt"
+indexinfo[0].command[30].command "lowercase"
+indexinfo[0].command[31].indexname "fmt"
+indexinfo[0].command[31].command "stem:SHORTEST"
+indexinfo[0].command[32].indexname "fmt"
+indexinfo[0].command[32].command "normalize"
+indexinfo[0].command[33].indexname "albumid"
+indexinfo[0].command[33].command "index"
+indexinfo[0].command[34].indexname "disp_song"
+indexinfo[0].command[34].command "index"
+indexinfo[0].command[35].indexname "song"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "song"
+indexinfo[0].command[36].command "lowercase"
+indexinfo[0].command[37].indexname "song"
+indexinfo[0].command[37].command "stem:SHORTEST"
+indexinfo[0].command[38].indexname "song"
+indexinfo[0].command[38].command "normalize"
+indexinfo[0].command[39].indexname "pfrom"
+indexinfo[0].command[39].command "index"
+indexinfo[0].command[40].indexname "pfrom"
+indexinfo[0].command[40].command "numerical"
+indexinfo[0].command[41].indexname "bgnpfrom"
+indexinfo[0].command[41].command "index"
+indexinfo[0].command[42].indexname "bgnpfrom"
+indexinfo[0].command[42].command "attribute"
+indexinfo[0].command[43].indexname "bgnpfrom"
+indexinfo[0].command[43].command "numerical"
+indexinfo[0].command[44].indexname "categories"
+indexinfo[0].command[44].command "index"
+indexinfo[0].command[45].indexname "categories"
+indexinfo[0].command[45].command "lowercase"
+indexinfo[0].command[46].indexname "categories"
+indexinfo[0].command[46].command "stem:SHORTEST"
+indexinfo[0].command[47].indexname "categories"
+indexinfo[0].command[47].command "normalize"
+indexinfo[0].command[48].indexname "data"
+indexinfo[0].command[48].command "index"
+indexinfo[0].command[49].indexname "numreview"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "numreview"
+indexinfo[0].command[50].command "numerical"
+indexinfo[0].command[51].indexname "bgnsellers"
+indexinfo[0].command[51].command "index"
+indexinfo[0].command[52].indexname "bgnsellers"
+indexinfo[0].command[52].command "numerical"
+indexinfo[0].command[53].indexname "image"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "artist"
+indexinfo[0].command[54].command "index"
+indexinfo[0].command[55].indexname "artist"
+indexinfo[0].command[55].command "lowercase"
+indexinfo[0].command[56].indexname "artist"
+indexinfo[0].command[56].command "stem:SHORTEST"
+indexinfo[0].command[57].indexname "artist"
+indexinfo[0].command[57].command "normalize"
+indexinfo[0].command[58].indexname "artistspid"
+indexinfo[0].command[58].command "index"
+indexinfo[0].command[59].indexname "title"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "title"
+indexinfo[0].command[60].command "lowercase"
+indexinfo[0].command[61].indexname "title"
+indexinfo[0].command[61].command "stem:SHORTEST"
+indexinfo[0].command[62].indexname "title"
+indexinfo[0].command[62].command "normalize"
+indexinfo[0].command[63].indexname "newestedition"
+indexinfo[0].command[63].command "index"
+indexinfo[0].command[64].indexname "newestedition"
+indexinfo[0].command[64].command "attribute"
+indexinfo[0].command[65].indexname "newestedition"
+indexinfo[0].command[65].command "numerical"
+indexinfo[0].command[66].indexname "bgnpto"
+indexinfo[0].command[66].command "index"
+indexinfo[0].command[67].indexname "year"
+indexinfo[0].command[67].command "index"
+indexinfo[0].command[68].indexname "year"
+indexinfo[0].command[68].command "attribute"
+indexinfo[0].command[69].indexname "year"
+indexinfo[0].command[69].command "numerical"
+indexinfo[0].command[70].indexname "did"
+indexinfo[0].command[70].command "index"
+indexinfo[0].command[71].indexname "did"
+indexinfo[0].command[71].command "attribute"
+indexinfo[0].command[72].indexname "did"
+indexinfo[0].command[72].command "numerical"
+indexinfo[0].command[73].indexname "scorekey"
+indexinfo[0].command[73].command "index"
+indexinfo[0].command[74].indexname "scorekey"
+indexinfo[0].command[74].command "attribute"
+indexinfo[0].command[75].indexname "scorekey"
+indexinfo[0].command[75].command "numerical"
+indexinfo[0].command[76].indexname "cbid"
+indexinfo[0].command[76].command "index"
+indexinfo[0].command[77].indexname "cbid"
+indexinfo[0].command[77].command "attribute"
+indexinfo[0].command[78].indexname "cbid"
+indexinfo[0].command[78].command "numerical"
+indexinfo[0].command[79].indexname "rankfeatures"
+indexinfo[0].command[79].command "index"
+indexinfo[0].command[80].indexname "summaryfeatures"
+indexinfo[0].command[80].command "index"
+indexinfo[0].command[81].indexname "bgndata"
+indexinfo[0].command[81].command "dynteaser"
+indexinfo[0].command[82].indexname "ew"
+indexinfo[0].command[82].command "highlight"
+indexinfo[0].command[83].indexname "song"
+indexinfo[0].command[83].command "dynteaser"
+indexinfo[0].command[84].indexname "bgnpto"
+indexinfo[0].command[84].command "dynteaser"
+indexinfo[0].command[85].indexname "bgnpto"
+indexinfo[0].command[85].command "highlight"
+indexinfo[0].command[9].indexname "ew"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[11].indexname "ew"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[13].indexname "ew"
+indexinfo[0].command[13].command "stem:SHORTEST"
+indexinfo[0].command[15].indexname "ew"
+indexinfo[0].command[15].command "normalize"
diff --git a/config-model/src/test/derived/newrank/juniperrc.cfg b/config-model/src/test/derived/newrank/juniperrc.cfg
new file mode 100755
index 00000000000..b5d7438e081
--- /dev/null
+++ b/config-model/src/test/derived/newrank/juniperrc.cfg
@@ -0,0 +1,21 @@
+length 256
+max_matches 3
+min_length 128
+prefix true
+surround_max 128
+winsize 200
+winsize_fallback_multiplier 10.0
+max_match_candidates 1000
+stem_min_length 5
+stem_max_extend 3
+override[0].fieldname "ew"
+override[0].length 65536
+override[0].max_matches 1
+override[0].min_length 8192
+override[0].prefix true
+override[0].surround_max 65536
+override[0].winsize 200
+override[0].winsize_fallback_multiplier 10.0
+override[0].max_match_candidates 1000
+override[0].stem_min_length 5
+override[0].stem_max_extend 3 \ No newline at end of file
diff --git a/config-model/src/test/derived/newrank/newrank.sd b/config-model/src/test/derived/newrank/newrank.sd
new file mode 100644
index 00000000000..2a64c7cb07b
--- /dev/null
+++ b/config-model/src/test/derived/newrank/newrank.sd
@@ -0,0 +1,146 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search newrank{
+ document newrank{
+
+ field bgndata type string {
+ indexing: summary
+ summary: dynamic
+ }
+
+ field sales type int {
+ indexing: summary | attribute | index
+ }
+
+ field pto type int {
+ indexing: summary | attribute | index
+ }
+
+ field keys type string {
+ indexing: index
+ }
+
+ field mid type int {
+ indexing: summary | attribute | index
+ }
+
+ field ew type string {
+ indexing: summary | index
+ bolding: on
+ }
+
+ field surl type string {
+ indexing: summary
+ }
+
+ field userrate type int {
+ indexing: summary
+ }
+
+ field pid type string {
+ indexing: summary
+ }
+
+ field weight type float {
+ indexing: summary | attribute
+ }
+
+ field url type string {
+ indexing: summary
+ }
+
+ field isbn type string {
+ indexing: summary
+ }
+
+ field fmt type string {
+ indexing: summary | index
+ }
+
+ field albumid type string {
+ indexing: summary
+ }
+
+ field disp_song type string {
+ indexing: summary
+ }
+
+ field song type string {
+ indexing: summary | index
+ summary: dynamic
+ }
+
+ field pfrom type int {
+ indexing: summary
+ }
+
+ field bgnpfrom type float {
+ indexing: summary | attribute
+ }
+
+ field categories type string {
+ indexing: summary | index
+ }
+
+ field data type string {
+ indexing: summary
+ }
+
+ field numreview type int {
+ indexing: summary
+ }
+
+ field bgnsellers type int {
+ indexing: summary
+ }
+
+ field image type string {
+ indexing: summary
+ }
+
+ field artist type string {
+ indexing: summary | index
+ # index-to: artist, default
+ }
+
+ field artistspid type string {
+ indexing: summary
+ }
+
+ field title type string {
+ indexing: summary | index
+ }
+
+ field newestedition type int {
+ indexing: summary | attribute | index
+ }
+
+ field bgnpto type string {
+ indexing: summary
+ summary: dynamic
+ bolding: on
+ }
+
+ field year type int {
+ indexing: summary | attribute | index
+ }
+
+ field did type int {
+ indexing: summary | attribute | index
+ }
+
+ field scorekey type int {
+ indexing: summary | index
+ }
+
+ field cbid type int {
+ indexing: summary | attribute | index
+ }
+
+ }
+
+ fieldset default {
+ fields: keys, ew, song, title
+ }
+
+}
+
diff --git a/config-model/src/test/derived/newrank/rank-profiles.cfg b/config-model/src/test/derived/newrank/rank-profiles.cfg
new file mode 100644
index 00000000000..caca83a9a91
--- /dev/null
+++ b/config-model/src/test/derived/newrank/rank-profiles.cfg
@@ -0,0 +1,10 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/newrank/summary.cfg b/config-model/src/test/derived/newrank/summary.cfg
new file mode 100644
index 00000000000..7cb5a695a5d
--- /dev/null
+++ b/config-model/src/test/derived/newrank/summary.cfg
@@ -0,0 +1,97 @@
+defaultsummaryid 912980235
+classes[0].id 912980235
+classes[0].name "default"
+classes[0].fields[0].name "bgndata"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "sales"
+classes[0].fields[1].type "integer"
+classes[0].fields[2].name "pto"
+classes[0].fields[2].type "integer"
+classes[0].fields[3].name "mid"
+classes[0].fields[3].type "integer"
+classes[0].fields[4].name "ew"
+classes[0].fields[4].type "longstring"
+classes[0].fields[5].name "surl"
+classes[0].fields[5].type "longstring"
+classes[0].fields[6].name "userrate"
+classes[0].fields[6].type "integer"
+classes[0].fields[7].name "pid"
+classes[0].fields[7].type "longstring"
+classes[0].fields[8].name "weight"
+classes[0].fields[8].type "float"
+classes[0].fields[9].name "url"
+classes[0].fields[9].type "longstring"
+classes[0].fields[10].name "isbn"
+classes[0].fields[10].type "longstring"
+classes[0].fields[11].name "fmt"
+classes[0].fields[11].type "longstring"
+classes[0].fields[12].name "albumid"
+classes[0].fields[12].type "longstring"
+classes[0].fields[13].name "disp_song"
+classes[0].fields[13].type "longstring"
+classes[0].fields[14].name "song"
+classes[0].fields[14].type "longstring"
+classes[0].fields[15].name "pfrom"
+classes[0].fields[15].type "integer"
+classes[0].fields[16].name "bgnpfrom"
+classes[0].fields[16].type "float"
+classes[0].fields[17].name "categories"
+classes[0].fields[17].type "longstring"
+classes[0].fields[18].name "data"
+classes[0].fields[18].type "longstring"
+classes[0].fields[19].name "numreview"
+classes[0].fields[19].type "integer"
+classes[0].fields[20].name "bgnsellers"
+classes[0].fields[20].type "integer"
+classes[0].fields[21].name "image"
+classes[0].fields[21].type "longstring"
+classes[0].fields[22].name "artist"
+classes[0].fields[22].type "longstring"
+classes[0].fields[23].name "artistspid"
+classes[0].fields[23].type "longstring"
+classes[0].fields[24].name "title"
+classes[0].fields[24].type "longstring"
+classes[0].fields[25].name "newestedition"
+classes[0].fields[25].type "integer"
+classes[0].fields[26].name "bgnpto"
+classes[0].fields[26].type "longstring"
+classes[0].fields[27].name "year"
+classes[0].fields[27].type "integer"
+classes[0].fields[28].name "did"
+classes[0].fields[28].type "integer"
+classes[0].fields[29].name "scorekey"
+classes[0].fields[29].type "integer"
+classes[0].fields[30].name "cbid"
+classes[0].fields[30].type "integer"
+classes[0].fields[31].name "rankfeatures"
+classes[0].fields[31].type "featuredata"
+classes[0].fields[32].name "summaryfeatures"
+classes[0].fields[32].type "featuredata"
+classes[0].fields[33].name "documentid"
+classes[0].fields[33].type "longstring"
+classes[1].id 1606815285
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "sales"
+classes[1].fields[0].type "integer"
+classes[1].fields[1].name "pto"
+classes[1].fields[1].type "integer"
+classes[1].fields[2].name "mid"
+classes[1].fields[2].type "integer"
+classes[1].fields[3].name "weight"
+classes[1].fields[3].type "float"
+classes[1].fields[4].name "bgnpfrom"
+classes[1].fields[4].type "float"
+classes[1].fields[5].name "newestedition"
+classes[1].fields[5].type "integer"
+classes[1].fields[6].name "year"
+classes[1].fields[6].type "integer"
+classes[1].fields[7].name "did"
+classes[1].fields[7].type "integer"
+classes[1].fields[8].name "scorekey"
+classes[1].fields[8].type "integer"
+classes[1].fields[9].name "cbid"
+classes[1].fields[9].type "integer"
+classes[1].fields[10].name "rankfeatures"
+classes[1].fields[10].type "featuredata"
+classes[1].fields[11].name "summaryfeatures"
+classes[1].fields[11].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/newrank/summarymap.cfg b/config-model/src/test/derived/newrank/summarymap.cfg
new file mode 100644
index 00000000000..1ba02ac9060
--- /dev/null
+++ b/config-model/src/test/derived/newrank/summarymap.cfg
@@ -0,0 +1,49 @@
+defaultoutputclass -1
+override[0].field "bgndata"
+override[0].command "dynamicteaser"
+override[0].arguments "bgndata"
+override[1].field "sales"
+override[1].command "attribute"
+override[1].arguments "sales"
+override[2].field "pto"
+override[2].command "attribute"
+override[2].arguments "pto"
+override[3].field "mid"
+override[3].command "attribute"
+override[3].arguments "mid"
+override[4].field "ew"
+override[4].command "dynamicteaser"
+override[4].arguments "ew"
+override[5].field "weight"
+override[5].command "attribute"
+override[5].arguments "weight"
+override[6].field "song"
+override[6].command "dynamicteaser"
+override[6].arguments "song"
+override[7].field "bgnpfrom"
+override[7].command "attribute"
+override[7].arguments "bgnpfrom"
+override[8].field "newestedition"
+override[8].command "attribute"
+override[8].arguments "newestedition"
+override[9].field "bgnpto"
+override[9].command "dynamicteaser"
+override[9].arguments "bgnpto"
+override[10].field "year"
+override[10].command "attribute"
+override[10].arguments "year"
+override[11].field "did"
+override[11].command "attribute"
+override[11].arguments "did"
+override[12].field "scorekey"
+override[12].command "attribute"
+override[12].arguments "scorekey"
+override[13].field "cbid"
+override[13].command "attribute"
+override[13].arguments "cbid"
+override[14].field "rankfeatures"
+override[14].command "rankfeatures"
+override[14].arguments ""
+override[15].field "summaryfeatures"
+override[15].command "summaryfeatures"
+override[15].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/orderilscripts/ilscripts.cfg b/config-model/src/test/derived/orderilscripts/ilscripts.cfg
new file mode 100755
index 00000000000..656381d68a8
--- /dev/null
+++ b/config-model/src/test/derived/orderilscripts/ilscripts.cfg
@@ -0,0 +1,5 @@
+maxtermoccurrences 100
+ilscript[0].doctype "orderilscripts"
+ilscript[0].docfield[0] "foo"
+ilscript[0].content[0] "clear_state | guard { input foo | summary bar; }"
+ilscript[0].content[1] "clear_state | guard { input foo | tokenize normalize stem:\"SHORTEST\" | summary foo | index foo; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/orderilscripts/orderilscripts.sd b/config-model/src/test/derived/orderilscripts/orderilscripts.sd
new file mode 100755
index 00000000000..d1de519d200
--- /dev/null
+++ b/config-model/src/test/derived/orderilscripts/orderilscripts.sd
@@ -0,0 +1,13 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search orderilscripts {
+
+ document orderilscripts {
+ field foo type string {
+ indexing: summary | index
+ }
+ }
+
+ field bar type string {
+ indexing: input foo | summary
+ }
+}
diff --git a/config-model/src/test/derived/position_array/ilscripts.cfg b/config-model/src/test/derived/position_array/ilscripts.cfg
new file mode 100644
index 00000000000..dfe3827a1d5
--- /dev/null
+++ b/config-model/src/test/derived/position_array/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "position_array"
+ilscript[0].docfield[0] "pos"
+ilscript[0].content[0] "clear_state | guard { input pos | for_each { zcurve } | attribute pos_zcurve; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_array/index-info.cfg b/config-model/src/test/derived/position_array/index-info.cfg
new file mode 100644
index 00000000000..8ae074d337f
--- /dev/null
+++ b/config-model/src/test/derived/position_array/index-info.cfg
@@ -0,0 +1,39 @@
+indexinfo[0].name "position_array"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "pos.x"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "pos.x"
+indexinfo[0].command[3].command "numerical"
+indexinfo[0].command[4].indexname "pos.y"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "pos.y"
+indexinfo[0].command[5].command "numerical"
+indexinfo[0].command[6].indexname "pos"
+indexinfo[0].command[6].command "default-position"
+indexinfo[0].command[7].indexname "pos"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "pos"
+indexinfo[0].command[8].command "multivalue"
+indexinfo[0].command[9].indexname "pos.distance"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "pos.distance"
+indexinfo[0].command[10].command "numerical"
+indexinfo[0].command[11].indexname "pos.position"
+indexinfo[0].command[11].command "index"
+indexinfo[0].command[12].indexname "pos.position"
+indexinfo[0].command[12].command "multivalue"
+indexinfo[0].command[13].indexname "pos_zcurve"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "pos_zcurve"
+indexinfo[0].command[14].command "multivalue"
+indexinfo[0].command[15].indexname "pos_zcurve"
+indexinfo[0].command[15].command "attribute"
+indexinfo[0].command[16].indexname "pos_zcurve"
+indexinfo[0].command[16].command "fast-search"
+indexinfo[0].command[17].indexname "rankfeatures"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "summaryfeatures"
+indexinfo[0].command[18].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_array/position_array.sd b/config-model/src/test/derived/position_array/position_array.sd
new file mode 100644
index 00000000000..e5042354ade
--- /dev/null
+++ b/config-model/src/test/derived/position_array/position_array.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position_array {
+ document position_array {
+ field pos type array<position> {
+ indexing: attribute
+ }
+ }
+}
diff --git a/config-model/src/test/derived/position_attribute/ilscripts.cfg b/config-model/src/test/derived/position_attribute/ilscripts.cfg
new file mode 100644
index 00000000000..ea6d6c4080b
--- /dev/null
+++ b/config-model/src/test/derived/position_attribute/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "position_attribute"
+ilscript[0].docfield[0] "pos"
+ilscript[0].content[0] "clear_state | guard { input pos | zcurve | attribute pos_zcurve; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_attribute/index-info.cfg b/config-model/src/test/derived/position_attribute/index-info.cfg
new file mode 100644
index 00000000000..99d2c621722
--- /dev/null
+++ b/config-model/src/test/derived/position_attribute/index-info.cfg
@@ -0,0 +1,37 @@
+indexinfo[0].name "position_attribute"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "pos.x"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "pos.x"
+indexinfo[0].command[3].command "numerical"
+indexinfo[0].command[4].indexname "pos.y"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "pos.y"
+indexinfo[0].command[5].command "numerical"
+indexinfo[0].command[6].indexname "pos"
+indexinfo[0].command[6].command "default-position"
+indexinfo[0].command[7].indexname "pos"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "pos.distance"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "pos.distance"
+indexinfo[0].command[9].command "numerical"
+indexinfo[0].command[10].indexname "pos.position"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "pos.position"
+indexinfo[0].command[11].command "multivalue"
+indexinfo[0].command[12].indexname "pos_zcurve"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "pos_zcurve"
+indexinfo[0].command[13].command "attribute"
+indexinfo[0].command[14].indexname "pos_zcurve"
+indexinfo[0].command[14].command "fast-search"
+indexinfo[0].command[15].indexname "pos_zcurve"
+indexinfo[0].command[15].command "numerical"
+indexinfo[0].command[16].indexname "rankfeatures"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "summaryfeatures"
+indexinfo[0].command[17].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_attribute/position_attribute.sd b/config-model/src/test/derived/position_attribute/position_attribute.sd
new file mode 100644
index 00000000000..6841c7847e0
--- /dev/null
+++ b/config-model/src/test/derived/position_attribute/position_attribute.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position_attribute {
+ document position_attribute {
+ field pos type position {
+ indexing: attribute
+ }
+ }
+}
diff --git a/config-model/src/test/derived/position_extra/ilscripts.cfg b/config-model/src/test/derived/position_extra/ilscripts.cfg
new file mode 100644
index 00000000000..33d61e55465
--- /dev/null
+++ b/config-model/src/test/derived/position_extra/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "position_extra"
+ilscript[0].docfield[0] "pos_str"
+ilscript[0].content[0] "clear_state | guard { input pos_str | to_pos | zcurve | attribute pos_ext_zcurve; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_extra/index-info.cfg b/config-model/src/test/derived/position_extra/index-info.cfg
new file mode 100644
index 00000000000..649dacc24e0
--- /dev/null
+++ b/config-model/src/test/derived/position_extra/index-info.cfg
@@ -0,0 +1,31 @@
+indexinfo[0].name "position_extra"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "pos_str"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "pos_ext"
+indexinfo[0].command[3].command "default-position"
+indexinfo[0].command[4].indexname "pos_ext"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "pos_ext.distance"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "pos_ext.distance"
+indexinfo[0].command[6].command "numerical"
+indexinfo[0].command[7].indexname "pos_ext.position"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "pos_ext.position"
+indexinfo[0].command[8].command "multivalue"
+indexinfo[0].command[9].indexname "pos_ext_zcurve"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "pos_ext_zcurve"
+indexinfo[0].command[10].command "attribute"
+indexinfo[0].command[11].indexname "pos_ext_zcurve"
+indexinfo[0].command[11].command "fast-search"
+indexinfo[0].command[12].indexname "pos_ext_zcurve"
+indexinfo[0].command[12].command "numerical"
+indexinfo[0].command[13].indexname "rankfeatures"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "summaryfeatures"
+indexinfo[0].command[14].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_extra/position_extra.sd b/config-model/src/test/derived/position_extra/position_extra.sd
new file mode 100644
index 00000000000..0254b4ed31d
--- /dev/null
+++ b/config-model/src/test/derived/position_extra/position_extra.sd
@@ -0,0 +1,11 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position_extra {
+ document position_extra {
+ field pos_str type string {
+
+ }
+ }
+ field pos_ext type position {
+ indexing: input pos_str | to_pos | attribute
+ }
+}
diff --git a/config-model/src/test/derived/position_nosummary/position_nosummary.sd b/config-model/src/test/derived/position_nosummary/position_nosummary.sd
new file mode 100644
index 00000000000..9b902b4d608
--- /dev/null
+++ b/config-model/src/test/derived/position_nosummary/position_nosummary.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position_nosummary {
+ document position_nosummary {
+ field pos type position {
+ indexing: attribute
+ }
+ }
+}
diff --git a/config-model/src/test/derived/position_nosummary/summary.cfg b/config-model/src/test/derived/position_nosummary/summary.cfg
new file mode 100644
index 00000000000..fbf091209b9
--- /dev/null
+++ b/config-model/src/test/derived/position_nosummary/summary.cfg
@@ -0,0 +1,21 @@
+defaultsummaryid 1727020212
+classes[0].id 1727020212
+classes[0].name "default"
+classes[0].fields[0].name "pos.position"
+classes[0].fields[0].type "xmlstring"
+classes[0].fields[1].name "pos.distance"
+classes[0].fields[1].type "integer"
+classes[0].fields[2].name "rankfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "summaryfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "documentid"
+classes[0].fields[4].type "longstring"
+classes[1].id 1530141163
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "pos_zcurve"
+classes[1].fields[0].type "int64"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].type "featuredata"
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_nosummary/summarymap.cfg b/config-model/src/test/derived/position_nosummary/summarymap.cfg
new file mode 100644
index 00000000000..2e8ada7daa0
--- /dev/null
+++ b/config-model/src/test/derived/position_nosummary/summarymap.cfg
@@ -0,0 +1,16 @@
+defaultoutputclass -1
+override[0].field "pos.position"
+override[0].command "positions"
+override[0].arguments "pos_zcurve"
+override[1].field "pos.distance"
+override[1].command "absdist"
+override[1].arguments "pos_zcurve"
+override[2].field "rankfeatures"
+override[2].command "rankfeatures"
+override[2].arguments ""
+override[3].field "summaryfeatures"
+override[3].command "summaryfeatures"
+override[3].arguments ""
+override[4].field "pos_zcurve"
+override[4].command "attribute"
+override[4].arguments "pos_zcurve" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_summary/position_summary.sd b/config-model/src/test/derived/position_summary/position_summary.sd
new file mode 100644
index 00000000000..ccc136f635a
--- /dev/null
+++ b/config-model/src/test/derived/position_summary/position_summary.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position_summary {
+ document position_summary {
+ field pos type position {
+ indexing: attribute | summary
+ }
+ }
+}
diff --git a/config-model/src/test/derived/position_summary/summary.cfg b/config-model/src/test/derived/position_summary/summary.cfg
new file mode 100644
index 00000000000..708fbe9ca18
--- /dev/null
+++ b/config-model/src/test/derived/position_summary/summary.cfg
@@ -0,0 +1,23 @@
+defaultsummaryid 230670304
+classes[0].id 230670304
+classes[0].name "default"
+classes[0].fields[0].name "pos"
+classes[0].fields[0].type "jsonstring"
+classes[0].fields[1].name "pos.position"
+classes[0].fields[1].type "xmlstring"
+classes[0].fields[2].name "pos.distance"
+classes[0].fields[2].type "integer"
+classes[0].fields[3].name "rankfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "summaryfeatures"
+classes[0].fields[4].type "featuredata"
+classes[0].fields[5].name "documentid"
+classes[0].fields[5].type "longstring"
+classes[1].id 1530141163
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "pos_zcurve"
+classes[1].fields[0].type "int64"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].type "featuredata"
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_summary/summarymap.cfg b/config-model/src/test/derived/position_summary/summarymap.cfg
new file mode 100644
index 00000000000..caf88368044
--- /dev/null
+++ b/config-model/src/test/derived/position_summary/summarymap.cfg
@@ -0,0 +1,19 @@
+defaultoutputclass -1
+override[0].field "pos"
+override[0].command "geopos"
+override[0].arguments "pos_zcurve"
+override[1].field "pos.position"
+override[1].command "positions"
+override[1].arguments "pos_zcurve"
+override[2].field "pos.distance"
+override[2].command "absdist"
+override[2].arguments "pos_zcurve"
+override[3].field "rankfeatures"
+override[3].command "rankfeatures"
+override[3].arguments ""
+override[4].field "summaryfeatures"
+override[4].command "summaryfeatures"
+override[4].arguments ""
+override[5].field "pos_zcurve"
+override[5].command "attribute"
+override[5].arguments "pos_zcurve" \ No newline at end of file
diff --git a/config-model/src/test/derived/position_summary/vsmsummary.cfg b/config-model/src/test/derived/position_summary/vsmsummary.cfg
new file mode 100644
index 00000000000..770a228ed52
--- /dev/null
+++ b/config-model/src/test/derived/position_summary/vsmsummary.cfg
@@ -0,0 +1,14 @@
+outputclass ""
+fieldmap[0].summary "pos"
+fieldmap[0].document[0].field "pos"
+fieldmap[0].command NONE
+fieldmap[1].summary "pos.position"
+fieldmap[1].document[0].field "pos_zcurve"
+fieldmap[1].command NONE
+fieldmap[2].summary "pos.distance"
+fieldmap[2].document[0].field "pos_zcurve"
+fieldmap[2].command NONE
+fieldmap[3].summary "rankfeatures"
+fieldmap[3].command NONE
+fieldmap[4].summary "summaryfeatures"
+fieldmap[4].command NONE \ No newline at end of file
diff --git a/config-model/src/test/derived/predicate_attribute/attributes.cfg b/config-model/src/test/derived/predicate_attribute/attributes.cfg
new file mode 100644
index 00000000000..49d86516930
--- /dev/null
+++ b/config-model/src/test/derived/predicate_attribute/attributes.cfg
@@ -0,0 +1,19 @@
+attribute[0].name "some_predicate_field"
+attribute[0].datatype PREDICATE
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 5
+attribute[0].lowerbound 3
+attribute[0].upperbound 200
+attribute[0].densepostinglistthreshold 0.2
+attribute[0].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/predicate_attribute/index-info.cfg b/config-model/src/test/derived/predicate_attribute/index-info.cfg
new file mode 100644
index 00000000000..b2c5f9c4d30
--- /dev/null
+++ b/config-model/src/test/derived/predicate_attribute/index-info.cfg
@@ -0,0 +1,15 @@
+indexinfo[0].name "predicate_type"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "some_predicate_field"
+indexinfo[0].command[2].command "predicate-bounds [3..200]"
+indexinfo[0].command[3].indexname "some_predicate_field"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "some_predicate_field"
+indexinfo[0].command[4].command "attribute"
+indexinfo[0].command[5].indexname "rankfeatures"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "summaryfeatures"
+indexinfo[0].command[6].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/predicate_attribute/predicate_attribute.sd b/config-model/src/test/derived/predicate_attribute/predicate_attribute.sd
new file mode 100644
index 00000000000..5b509fc1210
--- /dev/null
+++ b/config-model/src/test/derived/predicate_attribute/predicate_attribute.sd
@@ -0,0 +1,14 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search predicate_type {
+ document predicate_type {
+ field some_predicate_field type predicate {
+ indexing: attribute | summary
+ index {
+ arity: 5
+ lower-bound: 3
+ upper-bound: 200
+ dense-posting-list-threshold: 0.2
+ }
+ }
+ }
+}
diff --git a/config-model/src/test/derived/predicate_attribute/summary.cfg b/config-model/src/test/derived/predicate_attribute/summary.cfg
new file mode 100644
index 00000000000..e10af36caf5
--- /dev/null
+++ b/config-model/src/test/derived/predicate_attribute/summary.cfg
@@ -0,0 +1,17 @@
+defaultsummaryid 1391971216
+classes[0].id 1391971216
+classes[0].name "default"
+classes[0].fields[0].name "some_predicate_field"
+classes[0].fields[0].type "string"
+classes[0].fields[1].name "rankfeatures"
+classes[0].fields[1].type "featuredata"
+classes[0].fields[2].name "summaryfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "documentid"
+classes[0].fields[3].type "longstring"
+classes[1].id 1274088866
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "rankfeatures"
+classes[1].fields[0].type "featuredata"
+classes[1].fields[1].name "summaryfeatures"
+classes[1].fields[1].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/predicate_attribute/summarymap.cfg b/config-model/src/test/derived/predicate_attribute/summarymap.cfg
new file mode 100644
index 00000000000..42b6e811ee6
--- /dev/null
+++ b/config-model/src/test/derived/predicate_attribute/summarymap.cfg
@@ -0,0 +1,7 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/prefixexactattribute/attributes.cfg b/config-model/src/test/derived/prefixexactattribute/attributes.cfg
new file mode 100644
index 00000000000..257ebcdebab
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/attributes.cfg
@@ -0,0 +1,38 @@
+attribute[0].name "attributefield1"
+attribute[0].datatype STRING
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "attributefield2"
+attribute[1].datatype STRING
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg b/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg
new file mode 100644
index 00000000000..1b51178e6d8
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/documentmanager.cfg
@@ -0,0 +1,52 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -739138930
+datatype[1].structtype[0].name "prefixexactattribute.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "indexfield0"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "attributefield1"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "attributefield2"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[3].name "indexfield1"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[4].name "indexfield2"
+datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[5].name "rankfeatures"
+datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[6].name "summaryfeatures"
+datatype[1].structtype[0].field[6].datatype 2
+datatype[2].id -480519133
+datatype[2].structtype[0].name "prefixexactattribute.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id -1812793455
+datatype[3].documenttype[0].name "prefixexactattribute"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -739138930
+datatype[3].documenttype[0].bodystruct -480519133
+datatype[3].documenttype[0].fieldsets{[document]}.fields[0] "attributefield1"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[1] "attributefield2"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[2] "indexfield0"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[3] "indexfield1"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[4] "indexfield2"
diff --git a/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg b/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg
new file mode 100644
index 00000000000..76c9bf9abf5
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg
@@ -0,0 +1,12 @@
+maxtermoccurrences 100
+ilscript[0].doctype "prefixexactattribute"
+ilscript[0].docfield[0] "indexfield0"
+ilscript[0].docfield[1] "attributefield1"
+ilscript[0].docfield[2] "attributefield2"
+ilscript[0].docfield[3] "indexfield1"
+ilscript[0].docfield[4] "indexfield2"
+ilscript[0].content[0] "clear_state | guard { input indexfield0 | tokenize normalize stem:\"SHORTEST\" | index indexfield0; }"
+ilscript[0].content[1] "clear_state | guard { input attributefield1 | attribute attributefield1; }"
+ilscript[0].content[2] "clear_state | guard { input attributefield2 | attribute attributefield2; }"
+ilscript[0].content[3] "clear_state | guard { input indexfield1 | exact | index indexfield1; }"
+ilscript[0].content[4] "clear_state | guard { input indexfield2 | exact | index indexfield2; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/prefixexactattribute/index-info.cfg b/config-model/src/test/derived/prefixexactattribute/index-info.cfg
new file mode 100644
index 00000000000..74bf641990c
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/index-info.cfg
@@ -0,0 +1,41 @@
+indexinfo[0].name "prefixexactattribute"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "indexfield0"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "indexfield0"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "indexfield0"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "indexfield0"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "attributefield1"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "attributefield1"
+indexinfo[0].command[7].command "attribute"
+indexinfo[0].command[8].indexname "attributefield1"
+indexinfo[0].command[8].command "exact @"
+indexinfo[0].command[9].indexname "attributefield2"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "attributefield2"
+indexinfo[0].command[10].command "attribute"
+indexinfo[0].command[11].indexname "attributefield2"
+indexinfo[0].command[11].command "exact @"
+indexinfo[0].command[12].indexname "indexfield1"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "indexfield1"
+indexinfo[0].command[13].command "lowercase"
+indexinfo[0].command[14].indexname "indexfield1"
+indexinfo[0].command[14].command "exact @"
+indexinfo[0].command[15].indexname "indexfield2"
+indexinfo[0].command[15].command "index"
+indexinfo[0].command[16].indexname "indexfield2"
+indexinfo[0].command[16].command "lowercase"
+indexinfo[0].command[17].indexname "indexfield2"
+indexinfo[0].command[17].command "exact @"
+indexinfo[0].command[18].indexname "rankfeatures"
+indexinfo[0].command[18].command "index"
+indexinfo[0].command[19].indexname "summaryfeatures"
+indexinfo[0].command[19].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/prefixexactattribute/prefixexactattribute.sd b/config-model/src/test/derived/prefixexactattribute/prefixexactattribute.sd
new file mode 100644
index 00000000000..d2835a0e0f2
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/prefixexactattribute.sd
@@ -0,0 +1,52 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search prefixexactattribute {
+
+ document prefixexactattribute {
+
+ field indexfield0 type string {
+ indexing: index
+ match {
+ prefix
+ max-length: 79
+ }
+ }
+
+ field attributefield1 type string {
+ indexing: attribute
+ match {
+ prefix
+ exact
+ exact-terminator: "@"
+ }
+ }
+
+ field attributefield2 type string {
+ indexing: attribute
+ match {
+ exact
+ prefix
+ exact-terminator: "@"
+ }
+ }
+
+ field indexfield1 type string {
+ indexing: index
+ match {
+ exact
+ prefix
+ exact-terminator: "@"
+ }
+ }
+
+ # Old style - deprecated
+ field indexfield2 type string {
+ indexing: index
+ index: prefix
+ match {
+ exact
+ exact-terminator: "@"
+ }
+ }
+
+ }
+}
diff --git a/config-model/src/test/derived/prefixexactattribute/vsmfields.cfg b/config-model/src/test/derived/prefixexactattribute/vsmfields.cfg
new file mode 100644
index 00000000000..598dfc0b6b1
--- /dev/null
+++ b/config-model/src/test/derived/prefixexactattribute/vsmfields.cfg
@@ -0,0 +1,38 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "indexfield0"
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 "prefix"
+fieldspec[0].maxlength 79
+fieldspec[0].fieldtype INDEX
+fieldspec[1].name "attributefield1"
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 "exact"
+fieldspec[1].maxlength 1048576
+fieldspec[1].fieldtype ATTRIBUTE
+fieldspec[2].name "attributefield2"
+fieldspec[2].searchmethod AUTOUTF8
+fieldspec[2].arg1 "exact"
+fieldspec[2].maxlength 1048576
+fieldspec[2].fieldtype ATTRIBUTE
+fieldspec[3].name "indexfield1"
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 "exact"
+fieldspec[3].maxlength 1048576
+fieldspec[3].fieldtype INDEX
+fieldspec[4].name "indexfield2"
+fieldspec[4].searchmethod AUTOUTF8
+fieldspec[4].arg1 "exact"
+fieldspec[4].maxlength 1048576
+fieldspec[4].fieldtype INDEX
+documenttype[0].name "prefixexactattribute"
+documenttype[0].index[0].name "indexfield0"
+documenttype[0].index[0].field[0].name "indexfield0"
+documenttype[0].index[1].name "attributefield1"
+documenttype[0].index[1].field[0].name "attributefield1"
+documenttype[0].index[2].name "attributefield2"
+documenttype[0].index[2].field[0].name "attributefield2"
+documenttype[0].index[3].name "indexfield1"
+documenttype[0].index[3].field[0].name "indexfield1"
+documenttype[0].index[4].name "indexfield2"
+documenttype[0].index[4].field[0].name "indexfield2" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankexpression/macro.expression b/config-model/src/test/derived/rankexpression/macro.expression
new file mode 100644
index 00000000000..054b025b2e7
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/macro.expression
@@ -0,0 +1 @@
+703 * fieldMatch(fromfile).completeness \ No newline at end of file
diff --git a/config-model/src/test/derived/rankexpression/overflow.expression b/config-model/src/test/derived/rankexpression/overflow.expression
new file mode 100644
index 00000000000..4d3a6faeeb5
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/overflow.expression
@@ -0,0 +1,300 @@
+feature1(argument1, argument2, argument3, argument4).output +
+feature2(argument1, argument2, argument3, argument4).output +
+feature3(argument1, argument2, argument3, argument4).output +
+feature4(argument1, argument2, argument3, argument4).output +
+feature5(argument1, argument2, argument3, argument4).output +
+feature6(argument1, argument2, argument3, argument4).output +
+feature7(argument1, argument2, argument3, argument4).output +
+feature8(argument1, argument2, argument3, argument4).output +
+feature9(argument1, argument2, argument3, argument4).output +
+feature10(argument1, argument2, argument3, argument4).output +
+feature11(argument1, argument2, argument3, argument4).output +
+feature12(argument1, argument2, argument3, argument4).output +
+feature13(argument1, argument2, argument3, argument4).output +
+feature14(argument1, argument2, argument3, argument4).output +
+feature15(argument1, argument2, argument3, argument4).output +
+feature16(argument1, argument2, argument3, argument4).output +
+feature17(argument1, argument2, argument3, argument4).output +
+feature18(argument1, argument2, argument3, argument4).output +
+feature19(argument1, argument2, argument3, argument4).output +
+feature20(argument1, argument2, argument3, argument4).output +
+feature21(argument1, argument2, argument3, argument4).output +
+feature22(argument1, argument2, argument3, argument4).output +
+feature23(argument1, argument2, argument3, argument4).output +
+feature24(argument1, argument2, argument3, argument4).output +
+feature25(argument1, argument2, argument3, argument4).output +
+feature26(argument1, argument2, argument3, argument4).output +
+feature27(argument1, argument2, argument3, argument4).output +
+feature28(argument1, argument2, argument3, argument4).output +
+feature29(argument1, argument2, argument3, argument4).output +
+feature30(argument1, argument2, argument3, argument4).output +
+feature31(argument1, argument2, argument3, argument4).output +
+feature32(argument1, argument2, argument3, argument4).output +
+feature33(argument1, argument2, argument3, argument4).output +
+feature34(argument1, argument2, argument3, argument4).output +
+feature35(argument1, argument2, argument3, argument4).output +
+feature36(argument1, argument2, argument3, argument4).output +
+feature37(argument1, argument2, argument3, argument4).output +
+feature38(argument1, argument2, argument3, argument4).output +
+feature39(argument1, argument2, argument3, argument4).output +
+feature40(argument1, argument2, argument3, argument4).output +
+feature41(argument1, argument2, argument3, argument4).output +
+feature42(argument1, argument2, argument3, argument4).output +
+feature43(argument1, argument2, argument3, argument4).output +
+feature44(argument1, argument2, argument3, argument4).output +
+feature45(argument1, argument2, argument3, argument4).output +
+feature46(argument1, argument2, argument3, argument4).output +
+feature47(argument1, argument2, argument3, argument4).output +
+feature48(argument1, argument2, argument3, argument4).output +
+feature49(argument1, argument2, argument3, argument4).output +
+feature50(argument1, argument2, argument3, argument4).output +
+feature51(argument1, argument2, argument3, argument4).output +
+feature52(argument1, argument2, argument3, argument4).output +
+feature53(argument1, argument2, argument3, argument4).output +
+feature54(argument1, argument2, argument3, argument4).output +
+feature55(argument1, argument2, argument3, argument4).output +
+feature56(argument1, argument2, argument3, argument4).output +
+feature57(argument1, argument2, argument3, argument4).output +
+feature58(argument1, argument2, argument3, argument4).output +
+feature59(argument1, argument2, argument3, argument4).output +
+feature60(argument1, argument2, argument3, argument4).output +
+feature61(argument1, argument2, argument3, argument4).output +
+feature62(argument1, argument2, argument3, argument4).output +
+feature63(argument1, argument2, argument3, argument4).output +
+feature64(argument1, argument2, argument3, argument4).output +
+feature65(argument1, argument2, argument3, argument4).output +
+feature66(argument1, argument2, argument3, argument4).output +
+feature67(argument1, argument2, argument3, argument4).output +
+feature68(argument1, argument2, argument3, argument4).output +
+feature69(argument1, argument2, argument3, argument4).output +
+feature70(argument1, argument2, argument3, argument4).output +
+feature71(argument1, argument2, argument3, argument4).output +
+feature72(argument1, argument2, argument3, argument4).output +
+feature73(argument1, argument2, argument3, argument4).output +
+feature74(argument1, argument2, argument3, argument4).output +
+feature75(argument1, argument2, argument3, argument4).output +
+feature76(argument1, argument2, argument3, argument4).output +
+feature77(argument1, argument2, argument3, argument4).output +
+feature78(argument1, argument2, argument3, argument4).output +
+feature79(argument1, argument2, argument3, argument4).output +
+feature80(argument1, argument2, argument3, argument4).output +
+feature81(argument1, argument2, argument3, argument4).output +
+feature82(argument1, argument2, argument3, argument4).output +
+feature83(argument1, argument2, argument3, argument4).output +
+feature84(argument1, argument2, argument3, argument4).output +
+feature85(argument1, argument2, argument3, argument4).output +
+feature86(argument1, argument2, argument3, argument4).output +
+feature87(argument1, argument2, argument3, argument4).output +
+feature88(argument1, argument2, argument3, argument4).output +
+feature89(argument1, argument2, argument3, argument4).output +
+feature90(argument1, argument2, argument3, argument4).output +
+feature91(argument1, argument2, argument3, argument4).output +
+feature92(argument1, argument2, argument3, argument4).output +
+feature93(argument1, argument2, argument3, argument4).output +
+feature94(argument1, argument2, argument3, argument4).output +
+feature95(argument1, argument2, argument3, argument4).output +
+feature96(argument1, argument2, argument3, argument4).output +
+feature97(argument1, argument2, argument3, argument4).output +
+feature98(argument1, argument2, argument3, argument4).output +
+feature99(argument1, argument2, argument3, argument4).output +
+feature100(argument1, argument2, argument3, argument4).output +
+feature101(argument1, argument2, argument3, argument4).output +
+feature102(argument1, argument2, argument3, argument4).output +
+feature103(argument1, argument2, argument3, argument4).output +
+feature104(argument1, argument2, argument3, argument4).output +
+feature105(argument1, argument2, argument3, argument4).output +
+feature106(argument1, argument2, argument3, argument4).output +
+feature107(argument1, argument2, argument3, argument4).output +
+feature108(argument1, argument2, argument3, argument4).output +
+feature109(argument1, argument2, argument3, argument4).output +
+feature110(argument1, argument2, argument3, argument4).output +
+feature111(argument1, argument2, argument3, argument4).output +
+feature112(argument1, argument2, argument3, argument4).output +
+feature113(argument1, argument2, argument3, argument4).output +
+feature114(argument1, argument2, argument3, argument4).output +
+feature115(argument1, argument2, argument3, argument4).output +
+feature116(argument1, argument2, argument3, argument4).output +
+feature117(argument1, argument2, argument3, argument4).output +
+feature118(argument1, argument2, argument3, argument4).output +
+feature119(argument1, argument2, argument3, argument4).output +
+feature120(argument1, argument2, argument3, argument4).output +
+feature121(argument1, argument2, argument3, argument4).output +
+feature122(argument1, argument2, argument3, argument4).output +
+feature123(argument1, argument2, argument3, argument4).output +
+feature124(argument1, argument2, argument3, argument4).output +
+feature125(argument1, argument2, argument3, argument4).output +
+feature126(argument1, argument2, argument3, argument4).output +
+feature127(argument1, argument2, argument3, argument4).output +
+feature128(argument1, argument2, argument3, argument4).output +
+feature129(argument1, argument2, argument3, argument4).output +
+feature130(argument1, argument2, argument3, argument4).output +
+feature131(argument1, argument2, argument3, argument4).output +
+feature132(argument1, argument2, argument3, argument4).output +
+feature133(argument1, argument2, argument3, argument4).output +
+feature134(argument1, argument2, argument3, argument4).output +
+feature135(argument1, argument2, argument3, argument4).output +
+feature136(argument1, argument2, argument3, argument4).output +
+feature137(argument1, argument2, argument3, argument4).output +
+feature138(argument1, argument2, argument3, argument4).output +
+feature139(argument1, argument2, argument3, argument4).output +
+feature140(argument1, argument2, argument3, argument4).output +
+feature141(argument1, argument2, argument3, argument4).output +
+feature142(argument1, argument2, argument3, argument4).output +
+feature143(argument1, argument2, argument3, argument4).output +
+feature144(argument1, argument2, argument3, argument4).output +
+feature145(argument1, argument2, argument3, argument4).output +
+feature146(argument1, argument2, argument3, argument4).output +
+feature147(argument1, argument2, argument3, argument4).output +
+feature148(argument1, argument2, argument3, argument4).output +
+feature149(argument1, argument2, argument3, argument4).output +
+feature150(argument1, argument2, argument3, argument4).output +
+feature151(argument1, argument2, argument3, argument4).output +
+feature152(argument1, argument2, argument3, argument4).output +
+feature153(argument1, argument2, argument3, argument4).output +
+feature154(argument1, argument2, argument3, argument4).output +
+feature155(argument1, argument2, argument3, argument4).output +
+feature156(argument1, argument2, argument3, argument4).output +
+feature157(argument1, argument2, argument3, argument4).output +
+feature158(argument1, argument2, argument3, argument4).output +
+feature159(argument1, argument2, argument3, argument4).output +
+feature160(argument1, argument2, argument3, argument4).output +
+feature161(argument1, argument2, argument3, argument4).output +
+feature162(argument1, argument2, argument3, argument4).output +
+feature163(argument1, argument2, argument3, argument4).output +
+feature164(argument1, argument2, argument3, argument4).output +
+feature165(argument1, argument2, argument3, argument4).output +
+feature166(argument1, argument2, argument3, argument4).output +
+feature167(argument1, argument2, argument3, argument4).output +
+feature168(argument1, argument2, argument3, argument4).output +
+feature169(argument1, argument2, argument3, argument4).output +
+feature170(argument1, argument2, argument3, argument4).output +
+feature171(argument1, argument2, argument3, argument4).output +
+feature172(argument1, argument2, argument3, argument4).output +
+feature173(argument1, argument2, argument3, argument4).output +
+feature174(argument1, argument2, argument3, argument4).output +
+feature175(argument1, argument2, argument3, argument4).output +
+feature176(argument1, argument2, argument3, argument4).output +
+feature177(argument1, argument2, argument3, argument4).output +
+feature178(argument1, argument2, argument3, argument4).output +
+feature179(argument1, argument2, argument3, argument4).output +
+feature180(argument1, argument2, argument3, argument4).output +
+feature181(argument1, argument2, argument3, argument4).output +
+feature182(argument1, argument2, argument3, argument4).output +
+feature183(argument1, argument2, argument3, argument4).output +
+feature184(argument1, argument2, argument3, argument4).output +
+feature185(argument1, argument2, argument3, argument4).output +
+feature186(argument1, argument2, argument3, argument4).output +
+feature187(argument1, argument2, argument3, argument4).output +
+feature188(argument1, argument2, argument3, argument4).output +
+feature189(argument1, argument2, argument3, argument4).output +
+feature190(argument1, argument2, argument3, argument4).output +
+feature191(argument1, argument2, argument3, argument4).output +
+feature192(argument1, argument2, argument3, argument4).output +
+feature193(argument1, argument2, argument3, argument4).output +
+feature194(argument1, argument2, argument3, argument4).output +
+feature195(argument1, argument2, argument3, argument4).output +
+feature196(argument1, argument2, argument3, argument4).output +
+feature197(argument1, argument2, argument3, argument4).output +
+feature198(argument1, argument2, argument3, argument4).output +
+feature199(argument1, argument2, argument3, argument4).output +
+feature200(argument1, argument2, argument3, argument4).output +
+feature201(argument1, argument2, argument3, argument4).output +
+feature202(argument1, argument2, argument3, argument4).output +
+feature203(argument1, argument2, argument3, argument4).output +
+feature204(argument1, argument2, argument3, argument4).output +
+feature205(argument1, argument2, argument3, argument4).output +
+feature206(argument1, argument2, argument3, argument4).output +
+feature207(argument1, argument2, argument3, argument4).output +
+feature208(argument1, argument2, argument3, argument4).output +
+feature209(argument1, argument2, argument3, argument4).output +
+feature210(argument1, argument2, argument3, argument4).output +
+feature211(argument1, argument2, argument3, argument4).output +
+feature212(argument1, argument2, argument3, argument4).output +
+feature213(argument1, argument2, argument3, argument4).output +
+feature214(argument1, argument2, argument3, argument4).output +
+feature215(argument1, argument2, argument3, argument4).output +
+feature216(argument1, argument2, argument3, argument4).output +
+feature217(argument1, argument2, argument3, argument4).output +
+feature218(argument1, argument2, argument3, argument4).output +
+feature219(argument1, argument2, argument3, argument4).output +
+feature220(argument1, argument2, argument3, argument4).output +
+feature221(argument1, argument2, argument3, argument4).output +
+feature222(argument1, argument2, argument3, argument4).output +
+feature223(argument1, argument2, argument3, argument4).output +
+feature224(argument1, argument2, argument3, argument4).output +
+feature225(argument1, argument2, argument3, argument4).output +
+feature226(argument1, argument2, argument3, argument4).output +
+feature227(argument1, argument2, argument3, argument4).output +
+feature228(argument1, argument2, argument3, argument4).output +
+feature229(argument1, argument2, argument3, argument4).output +
+feature230(argument1, argument2, argument3, argument4).output +
+feature231(argument1, argument2, argument3, argument4).output +
+feature232(argument1, argument2, argument3, argument4).output +
+feature233(argument1, argument2, argument3, argument4).output +
+feature234(argument1, argument2, argument3, argument4).output +
+feature235(argument1, argument2, argument3, argument4).output +
+feature236(argument1, argument2, argument3, argument4).output +
+feature237(argument1, argument2, argument3, argument4).output +
+feature238(argument1, argument2, argument3, argument4).output +
+feature239(argument1, argument2, argument3, argument4).output +
+feature240(argument1, argument2, argument3, argument4).output +
+feature241(argument1, argument2, argument3, argument4).output +
+feature242(argument1, argument2, argument3, argument4).output +
+feature243(argument1, argument2, argument3, argument4).output +
+feature244(argument1, argument2, argument3, argument4).output +
+feature245(argument1, argument2, argument3, argument4).output +
+feature246(argument1, argument2, argument3, argument4).output +
+feature247(argument1, argument2, argument3, argument4).output +
+feature248(argument1, argument2, argument3, argument4).output +
+feature249(argument1, argument2, argument3, argument4).output +
+feature250(argument1, argument2, argument3, argument4).output +
+feature251(argument1, argument2, argument3, argument4).output +
+feature252(argument1, argument2, argument3, argument4).output +
+feature253(argument1, argument2, argument3, argument4).output +
+feature254(argument1, argument2, argument3, argument4).output +
+feature255(argument1, argument2, argument3, argument4).output +
+feature256(argument1, argument2, argument3, argument4).output +
+feature257(argument1, argument2, argument3, argument4).output +
+feature258(argument1, argument2, argument3, argument4).output +
+feature259(argument1, argument2, argument3, argument4).output +
+feature260(argument1, argument2, argument3, argument4).output +
+feature261(argument1, argument2, argument3, argument4).output +
+feature262(argument1, argument2, argument3, argument4).output +
+feature263(argument1, argument2, argument3, argument4).output +
+feature264(argument1, argument2, argument3, argument4).output +
+feature265(argument1, argument2, argument3, argument4).output +
+feature266(argument1, argument2, argument3, argument4).output +
+feature267(argument1, argument2, argument3, argument4).output +
+feature268(argument1, argument2, argument3, argument4).output +
+feature269(argument1, argument2, argument3, argument4).output +
+feature270(argument1, argument2, argument3, argument4).output +
+feature271(argument1, argument2, argument3, argument4).output +
+feature272(argument1, argument2, argument3, argument4).output +
+feature273(argument1, argument2, argument3, argument4).output +
+feature274(argument1, argument2, argument3, argument4).output +
+feature275(argument1, argument2, argument3, argument4).output +
+feature276(argument1, argument2, argument3, argument4).output +
+feature277(argument1, argument2, argument3, argument4).output +
+feature278(argument1, argument2, argument3, argument4).output +
+feature279(argument1, argument2, argument3, argument4).output +
+feature280(argument1, argument2, argument3, argument4).output +
+feature281(argument1, argument2, argument3, argument4).output +
+feature282(argument1, argument2, argument3, argument4).output +
+feature283(argument1, argument2, argument3, argument4).output +
+feature284(argument1, argument2, argument3, argument4).output +
+feature285(argument1, argument2, argument3, argument4).output +
+feature286(argument1, argument2, argument3, argument4).output +
+feature287(argument1, argument2, argument3, argument4).output +
+feature288(argument1, argument2, argument3, argument4).output +
+feature289(argument1, argument2, argument3, argument4).output +
+feature290(argument1, argument2, argument3, argument4).output +
+feature291(argument1, argument2, argument3, argument4).output +
+feature292(argument1, argument2, argument3, argument4).output +
+feature293(argument1, argument2, argument3, argument4).output +
+feature294(argument1, argument2, argument3, argument4).output +
+feature295(argument1, argument2, argument3, argument4).output +
+feature296(argument1, argument2, argument3, argument4).output +
+feature297(argument1, argument2, argument3, argument4).output +
+feature298(argument1, argument2, argument3, argument4).output +
+feature299(argument1, argument2, argument3, argument4).output +
+feature300(argument1, argument2, argument3, argument4).output \ No newline at end of file
diff --git a/config-model/src/test/derived/rankexpression/rank-profiles.cfg b/config-model/src/test/derived/rankexpression/rank-profiles.cfg
new file mode 100644
index 00000000000..e890b75770b
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/rank-profiles.cfg
@@ -0,0 +1,296 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "foo"
+rankprofile[0].fef.property[0].value "bar, baz"
+rankprofile[0].fef.property[1].name "foo"
+rankprofile[0].fef.property[1].value "foobar"
+rankprofile[0].fef.property[2].name "qux"
+rankprofile[0].fef.property[2].value "quux"
+rankprofile[0].fef.property[3].name "foo.bar"
+rankprofile[0].fef.property[3].value "foo.bar"
+rankprofile[0].fef.property[4].name "foo.bar.baz"
+rankprofile[0].fef.property[4].value "123"
+rankprofile[0].fef.property[5].name "foo(bar).baz.2"
+rankprofile[0].fef.property[5].value "123.4"
+rankprofile[0].fef.property[6].name "foo(bar).baz.qux"
+rankprofile[0].fef.property[6].value "foo(bar)"
+rankprofile[0].fef.property[7].name "nud"
+rankprofile[0].fef.property[7].value "ity"
+rankprofile[0].fef.property[8].name "vespa.rank.firstphase"
+rankprofile[0].fef.property[8].value "classicRank"
+rankprofile[0].fef.property[9].name "vespa.rank.secondphase"
+rankprofile[0].fef.property[9].value "rankingExpression(secondphase)"
+rankprofile[0].fef.property[10].name "rankingExpression(secondphase).rankingScript"
+rankprofile[0].fef.property[10].value "4"
+rankprofile[0].fef.property[11].name "vespa.dump.feature"
+rankprofile[0].fef.property[11].value "attribute(foo1).out"
+rankprofile[0].fef.property[12].name "vespa.dump.feature"
+rankprofile[0].fef.property[12].value "attribute(bar1.out)"
+rankprofile[0].fef.property[13].name "vespa.dump.feature"
+rankprofile[0].fef.property[13].value "attribute(foo2).out"
+rankprofile[0].fef.property[14].name "vespa.dump.feature"
+rankprofile[0].fef.property[14].value "attribute(bar2).out"
+rankprofile[0].fef.property[15].name "vespa.dump.feature"
+rankprofile[0].fef.property[15].value "attribute(foo3).out"
+rankprofile[0].fef.property[16].name "vespa.dump.feature"
+rankprofile[0].fef.property[16].value "attribute(bar3).out"
+rankprofile[0].fef.property[17].name "vespa.dump.feature"
+rankprofile[0].fef.property[17].value "attribute(foo4).out"
+rankprofile[0].fef.property[18].name "vespa.dump.feature"
+rankprofile[0].fef.property[18].value "attribute(bar4).out"
+rankprofile[0].fef.property[19].name "vespa.hitcollector.heapsize"
+rankprofile[0].fef.property[19].value "10"
+rankprofile[0].fef.property[20].name "vespa.hitcollector.arraysize"
+rankprofile[0].fef.property[20].value "20"
+rankprofile[0].fef.property[21].name "vespa.hitcollector.rankscoredroplimit"
+rankprofile[0].fef.property[21].value "-0.5"
+rankprofile[0].fef.property[22].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[0].fef.property[22].value "true"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "static"
+rankprofile[2].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[2].fef.property[0].value "attribute"
+rankprofile[2].fef.property[1].name "vespa.rank.secondphase"
+rankprofile[2].fef.property[1].value "rankingExpression(secondphase)"
+rankprofile[2].fef.property[2].name "rankingExpression(secondphase).rankingScript"
+rankprofile[2].fef.property[2].value "10 + feature(arg1).out.out"
+rankprofile[2].fef.property[3].name "vespa.summary.feature"
+rankprofile[2].fef.property[3].value "attribute(foo1).out"
+rankprofile[2].fef.property[4].name "vespa.summary.feature"
+rankprofile[2].fef.property[4].value "attribute(bar1.out)"
+rankprofile[2].fef.property[5].name "vespa.summary.feature"
+rankprofile[2].fef.property[5].value "attribute(foo2).out"
+rankprofile[2].fef.property[6].name "vespa.summary.feature"
+rankprofile[2].fef.property[6].value "attribute(bar2).out"
+rankprofile[2].fef.property[7].name "vespa.summary.feature"
+rankprofile[2].fef.property[7].value "attribute(foo3).out"
+rankprofile[2].fef.property[8].name "vespa.summary.feature"
+rankprofile[2].fef.property[8].value "attribute(bar3).out"
+rankprofile[2].fef.property[9].name "vespa.summary.feature"
+rankprofile[2].fef.property[9].value "attribute(foo4).out"
+rankprofile[2].fef.property[10].name "vespa.summary.feature"
+rankprofile[2].fef.property[10].value "attribute(bar4).out"
+rankprofile[3].name "overflow"
+rankprofile[3].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[3].fef.property[0].value "rankingExpression(firstphase)"
+rankprofile[3].fef.property[1].name "rankingExpression(firstphase).rankingScript"
+rankprofile[3].fef.property[1].value "feature1(argument1,argument2,argument3,argument4).output + feature2(argument1,argument2,argument3,argument4).output + feature3(argument1,argument2,argument3,argument4).output + feature4(argument1,argument2,argument3,argument4).output + feature5(argument1,argument2,argument3,argument4).output + feature6(argument1,argument2,argument3,argument4).output + feature7(argument1,argument2,argument3,argument4).output + feature8(argument1,argument2,argument3,argument4).output + feature9(argument1,argument2,argument3,argument4).output + feature10(argument1,argument2,argument3,argument4).output + feature11(argument1,argument2,argument3,argument4).output + feature12(argument1,argument2,argument3,argument4).output + feature13(argument1,argument2,argument3,argument4).output + feature14(argument1,argument2,argument3,argument4).output + feature15(argument1,argument2,argument3,argument4).output + feature16(argument1,argument2,argument3,argument4).output + feature17(argument1,argument2,argument3,argument4).output + feature18(argument1,argument2,argument3,argument4).output + feature19(argument1,argument2,argument3,argument4).output + feature20(argument1,argument2,argument3,argument4).output + feature21(argument1,argument2,argument3,argument4).output + feature22(argument1,argument2,argument3,argument4).output + feature23(argument1,argument2,argument3,argument4).output + feature24(argument1,argument2,argument3,argument4).output + feature25(argument1,argument2,argument3,argument4).output + feature26(argument1,argument2,argument3,argument4).output + feature27(argument1,argument2,argument3,argument4).output + feature28(argument1,argument2,argument3,argument4).output + feature29(argument1,argument2,argument3,argument4).output + feature30(argument1,argument2,argument3,argument4).output + feature31(argument1,argument2,argument3,argument4).output + feature32(argument1,argument2,argument3,argument4).output + feature33(argument1,argument2,argument3,argument4).output + feature34(argument1,argument2,argument3,argument4).output + feature35(argument1,argument2,argument3,argument4).output + feature36(argument1,argument2,argument3,argument4).output + feature37(argument1,argument2,argument3,argument4).output + feature38(argument1,argument2,argument3,argument4).output + feature39(argument1,argument2,argument3,argument4).output + feature40(argument1,argument2,argument3,argument4).output + feature41(argument1,argument2,argument3,argument4).output + feature42(argument1,argument2,argument3,argument4).output + feature43(argument1,argument2,argument3,argument4).output + feature44(argument1,argument2,argument3,argument4).output + feature45(argument1,argument2,argument3,argument4).output + feature46(argument1,argument2,argument3,argument4).output + feature47(argument1,argument2,argument3,argument4).output + feature48(argument1,argument2,argument3,argument4).output + feature49(argument1,argument2,argument3,argument4).output + feature50(argument1,argument2,argument3,argument4).output + feature51(argument1,argument2,argument3,argument4).output + feature52(argument1,argument2,argument3,argument4).output + feature53(argument1,argument2,argument3,argument4).output + feature54(argument1,argument2,argument3,argument4).output + feature55(argument1,argument2,argument3,argument4).output + feature56(argument1,argument2,argument3,argument4).output + feature57(argument1,argument2,argument3,argument4).output + feature58(argument1,argument2,argument3,argument4).output + feature59(argument1,argument2,argument3,argument4).output + feature60(argument1,argument2,argument3,argument4).output + feature61(argument1,argument2,argument3,argument4).output + feature62(argument1,argument2,argument3,argument4).output + feature63(argument1,argument2,argument3,argument4).output + feature64(argument1,argument2,argument3,argument4).output + feature65(argument1,argument2,argument3,argument4).output + feature66(argument1,argument2,argument3,argument4).output + feature67(argument1,argument2,argument3,argument4).output + feature68(argument1,argument2,argument3,argument4).output + feature69(argument1,argument2,argument3,argument4).output + feature70(argument1,argument2,argument3,argument4).output + feature71(argument1,argument2,argument3,argument4).output + feature72(argument1,argument2,argument3,argument4).output + feature73(argument1,argument2,argument3,argument4).output + feature74(argument1,argument2,argument3,argument4).output + feature75(argument1,argument2,argument3,argument4).output + feature76(argument1,argument2,argument3,argument4).output + feature77(argument1,argument2,argument3,argument4).output + feature78(argument1,argument2,argument3,argument4).output + feature79(argument1,argument2,argument3,argument4).output + feature80(argument1,argument2,argument3,argument4).output + feature81(argument1,argument2,argument3,argument4).output + feature82(argument1,argument2,argument3,argument4).output + feature83(argument1,argument2,argument3,argument4).output + feature84(argument1,argument2,argument3,argument4).output + feature85(argument1,argument2,argument3,argument4).output + feature86(argument1,argument2,argument3,argument4).output + feature87(argument1,argument2,argument3,argument4).output + feature88(argument1,argument2,argument3,argument4).output + feature89(argument1,argument2,argument3,argument4).output + feature90(argument1,argument2,argument3,argument4).output + feature91(argument1,argument2,argument3,argument4).output + feature92(argument1,argument2,argument3,argument4).output + feature93(argument1,argument2,argument3,argument4).output + feature94(argument1,argument2,argument3,argument4).output + feature95(argument1,argument2,argument3,argument4).output + feature96(argument1,argument2,argument3,argument4).output + feature97(argument1,argument2,argument3,argument4).output + feature98(argument1,argument2,argument3,argument4).output + feature99(argument1,argument2,argument3,argument4).output + feature100(argument1,argument2,argument3,argument4).output + feature101(argument1,argument2,argument3,argument4).output + feature102(argument1,argument2,argument3,argument4).output + feature103(argument1,argument2,argument3,argument4).output + feature104(argument1,argument2,argument3,argument4).output + feature105(argument1,argument2,argument3,argument4).output + feature106(argument1,argument2,argument3,argument4).output + feature107(argument1,argument2,argument3,argument4).output + feature108(argument1,argument2,argument3,argument4).output + feature109(argument1,argument2,argument3,argument4).output + feature110(argument1,argument2,argument3,argument4).output + feature111(argument1,argument2,argument3,argument4).output + feature112(argument1,argument2,argument3,argument4).output + feature113(argument1,argument2,argument3,argument4).output + feature114(argument1,argument2,argument3,argument4).output + feature115(argument1,argument2,argument3,argument4).output + feature116(argument1,argument2,argument3,argument4).output + feature117(argument1,argument2,argument3,argument4).output + feature118(argument1,argument2,argument3,argument4).output + feature119(argument1,argument2,argument3,argument4).output + feature120(argument1,argument2,argument3,argument4).output + feature121(argument1,argument2,argument3,argument4).output + feature122(argument1,argument2,argument3,argument4).output + feature123(argument1,argument2,argument3,argument4).output + feature124(argument1,argument2,argument3,argument4).output + feature125(argument1,argument2,argument3,argument4).output + feature126(argument1,argument2,argument3,argument4).output + feature127(argument1,argument2,argument3,argument4).output + feature128(argument1,argument2,argument3,argument4).output + feature129(argument1,argument2,argument3,argument4).output + feature130(argument1,argument2,argument3,argument4).output + feature131(argument1,argument2,argument3,argument4).output + feature132(argument1,argument2,argument3,argument4).output + feature133(argument1,argument2,argument3,argument4).output + feature134(argument1,argument2,argument3,argument4).output + feature135(argument1,argument2,argument3,argument4).output + feature136(argument1,argument2,argument3,argument4).output + feature137(argument1,argument2,argument3,argument4).output + feature138(argument1,argument2,argument3,argument4).output + feature139(argument1,argument2,argument3,argument4).output + feature140(argument1,argument2,argument3,argument4).output + feature141(argument1,argument2,argument3,argument4).output + feature142(argument1,argument2,argument3,argument4).output + feature143(argument1,argument2,argument3,argument4).output + feature144(argument1,argument2,argument3,argument4).output + feature145(argument1,argument2,argument3,argument4).output + feature146(argument1,argument2,argument3,argument4).output + feature147(argument1,argument2,argument3,argument4).output + feature148(argument1,argument2,argument3,argument4).output + feature149(argument1,argument2,argument3,argument4).output + feature150(argument1,argument2,argument3,argument4).output + feature151(argument1,argument2,argument3,argument4).output + feature152(argument1,argument2,argument3,argument4).output + feature153(argument1,argument2,argument3,argument4).output + feature154(argument1,argument2,argument3,argument4).output + feature155(argument1,argument2,argument3,argument4).output + feature156(argument1,argument2,argument3,argument4).output + feature157(argument1,argument2,argument3,argument4).output + feature158(argument1,argument2,argument3,argument4).output + feature159(argument1,argument2,argument3,argument4).output + feature160(argument1,argument2,argument3,argument4).output + feature161(argument1,argument2,argument3,argument4).output + feature162(argument1,argument2,argument3,argument4).output + feature163(argument1,argument2,argument3,argument4).output + feature164(argument1,argument2,argument3,argument4).output + feature165(argument1,argument2,argument3,argument4).output + feature166(argument1,argument2,argument3,argument4).output + feature167(argument1,argument2,argument3,argument4).output + feature168(argument1,argument2,argument3,argument4).output + feature169(argument1,argument2,argument3,argument4).output + feature170(argument1,argument2,argument3,argument4).output + feature171(argument1,argument2,argument3,argument4).output + feature172(argument1,argument2,argument3,argument4).output + feature173(argument1,argument2,argument3,argument4).output + feature174(argument1,argument2,argument3,argument4).output + feature175(argument1,argument2,argument3,argument4).output + feature176(argument1,argument2,argument3,argument4).output + feature177(argument1,argument2,argument3,argument4).output + feature178(argument1,argument2,argument3,argument4).output + feature179(argument1,argument2,argument3,argument4).output + feature180(argument1,argument2,argument3,argument4).output + feature181(argument1,argument2,argument3,argument4).output + feature182(argument1,argument2,argument3,argument4).output + feature183(argument1,argument2,argument3,argument4).output + feature184(argument1,argument2,argument3,argument4).output + feature185(argument1,argument2,argument3,argument4).output + feature186(argument1,argument2,argument3,argument4).output + feature187(argument1,argument2,argument3,argument4).output + feature188(argument1,argument2,argument3,argument4).output + feature189(argument1,argument2,argument3,argument4).output + feature190(argument1,argument2,argument3,argument4).output + feature191(argument1,argument2,argument3,argument4).output + feature192(argument1,argument2,argument3,argument4).output + feature193(argument1,argument2,argument3,argument4).output + feature194(argument1,argument2,argument3,argument4).output + feature195(argument1,argument2,argument3,argument4).output + feature196(argument1,argument2,argument3,argument4).output + feature197(argument1,argument2,argument3,argument4).output + feature198(argument1,argument2,argument3,argument4).output + feature199(argument1,argument2,argument3,argument4).output + feature200(argument1,argument2,argument3,argument4).output + feature201(argument1,argument2,argument3,argument4).output + feature202(argument1,argument2,argument3,argument4).output + feature203(argument1,argument2,argument3,argument4).output + feature204(argument1,argument2,argument3,argument4).output + feature205(argument1,argument2,argument3,argument4).output + feature206(argument1,argument2,argument3,argument4).output + feature207(argument1,argument2,argument3,argument4).output + feature208(argument1,argument2,argument3,argument4).output + feature209(argument1,argument2,argument3,argument4).output + feature210(argument1,argument2,argument3,argument4).output + feature211(argument1,argument2,argument3,argument4).output + feature212(argument1,argument2,argument3,argument4).output + feature213(argument1,argument2,argument3,argument4).output + feature214(argument1,argument2,argument3,argument4).output + feature215(argument1,argument2,argument3,argument4).output + feature216(argument1,argument2,argument3,argument4).output + feature217(argument1,argument2,argument3,argument4).output + feature218(argument1,argument2,argument3,argument4).output + feature219(argument1,argument2,argument3,argument4).output + feature220(argument1,argument2,argument3,argument4).output + feature221(argument1,argument2,argument3,argument4).output + feature222(argument1,argument2,argument3,argument4).output + feature223(argument1,argument2,argument3,argument4).output + feature224(argument1,argument2,argument3,argument4).output + feature225(argument1,argument2,argument3,argument4).output + feature226(argument1,argument2,argument3,argument4).output + feature227(argument1,argument2,argument3,argument4).output + feature228(argument1,argument2,argument3,argument4).output + feature229(argument1,argument2,argument3,argument4).output + feature230(argument1,argument2,argument3,argument4).output + feature231(argument1,argument2,argument3,argument4).output + feature232(argument1,argument2,argument3,argument4).output + feature233(argument1,argument2,argument3,argument4).output + feature234(argument1,argument2,argument3,argument4).output + feature235(argument1,argument2,argument3,argument4).output + feature236(argument1,argument2,argument3,argument4).output + feature237(argument1,argument2,argument3,argument4).output + feature238(argument1,argument2,argument3,argument4).output + feature239(argument1,argument2,argument3,argument4).output + feature240(argument1,argument2,argument3,argument4).output + feature241(argument1,argument2,argument3,argument4).output + feature242(argument1,argument2,argument3,argument4).output + feature243(argument1,argument2,argument3,argument4).output + feature244(argument1,argument2,argument3,argument4).output + feature245(argument1,argument2,argument3,argument4).output + feature246(argument1,argument2,argument3,argument4).output + feature247(argument1,argument2,argument3,argument4).output + feature248(argument1,argument2,argument3,argument4).output + feature249(argument1,argument2,argument3,argument4).output + feature250(argument1,argument2,argument3,argument4).output + feature251(argument1,argument2,argument3,argument4).output + feature252(argument1,argument2,argument3,argument4).output + feature253(argument1,argument2,argument3,argument4).output + feature254(argument1,argument2,argument3,argument4).output + feature255(argument1,argument2,argument3,argument4).output + feature256(argument1,argument2,argument3,argument4).output + feature257(argument1,argument2,argument3,argument4).output + feature258(argument1,argument2,argument3,argument4).output + feature259(argument1,argument2,argument3,argument4).output + feature260(argument1,argument2,argument3,argument4).output + feature261(argument1,argument2,argument3,argument4).output + feature262(argument1,argument2,argument3,argument4).output + feature263(argument1,argument2,argument3,argument4).output + feature264(argument1,argument2,argument3,argument4).output + feature265(argument1,argument2,argument3,argument4).output + feature266(argument1,argument2,argument3,argument4).output + feature267(argument1,argument2,argument3,argument4).output + feature268(argument1,argument2,argument3,argument4).output + feature269(argument1,argument2,argument3,argument4).output + feature270(argument1,argument2,argument3,argument4).output + feature271(argument1,argument2,argument3,argument4).output + feature272(argument1,argument2,argument3,argument4).output + feature273(argument1,argument2,argument3,argument4).output + feature274(argument1,argument2,argument3,argument4).output + feature275(argument1,argument2,argument3,argument4).output + feature276(argument1,argument2,argument3,argument4).output + feature277(argument1,argument2,argument3,argument4).output + feature278(argument1,argument2,argument3,argument4).output + feature279(argument1,argument2,argument3,argument4).output + feature280(argument1,argument2,argument3,argument4).output + feature281(argument1,argument2,argument3,argument4).output + feature282(argument1,argument2,argument3,argument4).output + feature283(argument1,argument2,argument3,argument4).output + feature284(argument1,argument2,argument3,argument4).output + feature285(argument1,argument2,argument3,argument4).output + feature286(argument1,argument2,argument3,argument4).output + feature287(argument1,argument2,argument3,argument4).output + feature288(argument1,argument2,argument3,argument4).output + feature289(argument1,argument2,argument3,argument4).output + feature290(argument1,argument2,argument3,argument4).output + feature291(argument1,argument2,argument3,argument4).output + feature292(argument1,argument2,argument3,argument4).output + feature293(argument1,argument2,argument3,argument4).output + feature294(argument1,argument2,argument3,argument4).output + feature295(argument1,argument2,argument3,argument4).output + feature296(argument1,argument2,argument3,argument4).output + feature297(argument1,argument2,argument3,argument4).output + feature298(argument1,argument2,argument3,argument4).output + feature299(argument1,argument2,argument3,argument4).output + feature300(argument1,argument2,argument3,argument4).output"
+rankprofile[3].fef.property[2].name "vespa.rank.secondphase"
+rankprofile[3].fef.property[2].value "rankingExpression(secondphase)"
+rankprofile[3].fef.property[3].name "rankingExpression(secondphase).rankingScript"
+rankprofile[3].fef.property[3].value "exp(0) + mysum(attribute(foo),\"attribute( bar )\",\"attribute( \\\"baz\\\" )\")"
+rankprofile[3].fef.property[4].name "vespa.hitcollector.heapsize"
+rankprofile[3].fef.property[4].value "101"
+rankprofile[3].fef.property[5].name "vespa.hitcollector.arraysize"
+rankprofile[3].fef.property[5].value "201"
+rankprofile[3].fef.property[6].name "vespa.hitcollector.rankscoredroplimit"
+rankprofile[3].fef.property[6].value "501.5"
+rankprofile[4].name "duplicates"
+rankprofile[4].fef.property[0].name "fieldMatch(a).proximityLimit"
+rankprofile[4].fef.property[0].value "4"
+rankprofile[4].fef.property[1].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[1].value "0.2"
+rankprofile[4].fef.property[2].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[2].value "0.4"
+rankprofile[4].fef.property[3].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[3].value "0.6"
+rankprofile[4].fef.property[4].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[4].value "0.8"
+rankprofile[4].fef.property[5].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[5].value "1"
+rankprofile[4].fef.property[6].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[6].value "0.8"
+rankprofile[4].fef.property[7].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[7].value "0.6"
+rankprofile[4].fef.property[8].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[8].value "0.4"
+rankprofile[4].fef.property[9].name "fieldMatch(a).proximityTable"
+rankprofile[4].fef.property[9].value "0.2"
+rankprofile[5].name "whitespace1"
+rankprofile[5].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[5].fef.property[0].value "rankingExpression(firstphase)"
+rankprofile[5].fef.property[1].name "rankingExpression(firstphase).rankingScript"
+rankprofile[5].fef.property[1].value "1"
+rankprofile[6].name "whitespace2"
+rankprofile[6].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[6].fef.property[0].value "rankingExpression(firstphase)"
+rankprofile[6].fef.property[1].name "rankingExpression(firstphase).rankingScript"
+rankprofile[6].fef.property[1].value "1"
+rankprofile[7].name "macros"
+rankprofile[7].fef.property[0].name "rankingExpression(fourtimessum).rankingScript"
+rankprofile[7].fef.property[0].value "4 * (var1 + var2)"
+rankprofile[7].fef.property[1].name "rankingExpression(myfeature).rankingScript"
+rankprofile[7].fef.property[1].value "70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness,2) + 30 * pow(0 - fieldMatch(description).earliness,2)"
+rankprofile[7].fef.property[2].name "rankingExpression(fourtimessum@5cf279212355b980.67f1e87166cfef86).rankingScript"
+rankprofile[7].fef.property[2].value "4 * (match + rankBoost)"
+rankprofile[7].fef.property[3].name "vespa.rank.firstphase"
+rankprofile[7].fef.property[3].value "rankingExpression(firstphase)"
+rankprofile[7].fef.property[4].name "rankingExpression(firstphase).rankingScript"
+rankprofile[7].fef.property[4].value "match + fieldMatch(title) + rankingExpression(myfeature)"
+rankprofile[7].fef.property[5].name "vespa.rank.secondphase"
+rankprofile[7].fef.property[5].value "rankingExpression(fourtimessum@5cf279212355b980.67f1e87166cfef86)"
+rankprofile[7].fef.property[6].name "vespa.summary.feature"
+rankprofile[7].fef.property[6].value "fieldMatch(title)"
+rankprofile[8].name "macros2"
+rankprofile[8].fef.property[0].name "foo"
+rankprofile[8].fef.property[0].value "some, list"
+rankprofile[8].fef.property[1].name "rankingExpression(fourtimessum).rankingScript"
+rankprofile[8].fef.property[1].value "4 * (var1 + var2)"
+rankprofile[8].fef.property[2].name "rankingExpression(myfeature).rankingScript"
+rankprofile[8].fef.property[2].value "70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness,2) + 30 * pow(0 - fieldMatch(description).earliness,2)"
+rankprofile[8].fef.property[3].name "rankingExpression(mysummaryfeature).rankingScript"
+rankprofile[8].fef.property[3].value "70 * fieldMatch(title).completeness"
+rankprofile[8].fef.property[4].name "rankingExpression(mysummaryfeature2).rankingScript"
+rankprofile[8].fef.property[4].value "71 * fieldMatch(title).completeness"
+rankprofile[8].fef.property[5].name "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86).rankingScript"
+rankprofile[8].fef.property[5].value "4 * (match + match)"
+rankprofile[8].fef.property[6].name "vespa.rank.firstphase"
+rankprofile[8].fef.property[6].value "classicRank"
+rankprofile[8].fef.property[7].name "vespa.rank.secondphase"
+rankprofile[8].fef.property[7].value "rankingExpression(secondphase)"
+rankprofile[8].fef.property[8].name "rankingExpression(secondphase).rankingScript"
+rankprofile[8].fef.property[8].value "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86) + rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[8].fef.property[9].name "vespa.summary.feature"
+rankprofile[8].fef.property[9].value "rankingExpression(mysummaryfeature2)"
+rankprofile[8].fef.property[10].name "vespa.summary.feature"
+rankprofile[8].fef.property[10].value "rankingExpression(mysummaryfeature)"
+rankprofile[9].name "macros3"
+rankprofile[9].fef.property[0].name "rankingExpression(onlyusedinsummaryfeature).rankingScript"
+rankprofile[9].fef.property[0].value "5"
+rankprofile[9].fef.property[1].name "vespa.summary.feature"
+rankprofile[9].fef.property[1].value "rankingExpression(matches(title,rankingExpression(onlyusedinsummaryfeature)))"
+rankprofile[10].name "macros3-inherited"
+rankprofile[10].fef.property[0].name "rankingExpression(onlyusedinsummaryfeature).rankingScript"
+rankprofile[10].fef.property[0].value "5"
+rankprofile[10].fef.property[1].name "vespa.summary.feature"
+rankprofile[10].fef.property[1].value "rankingExpression(matches(title,rankingExpression(onlyusedinsummaryfeature)))"
+rankprofile[11].name "macros-inherited"
+rankprofile[11].fef.property[0].name "foo"
+rankprofile[11].fef.property[0].value "some, list"
+rankprofile[11].fef.property[1].name "rankingExpression(fourtimessum).rankingScript"
+rankprofile[11].fef.property[1].value "4 * (var1 + var2)"
+rankprofile[11].fef.property[2].name "rankingExpression(myfeature).rankingScript"
+rankprofile[11].fef.property[2].value "70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness,2) + 30 * pow(0 - fieldMatch(description).earliness,2)"
+rankprofile[11].fef.property[3].name "rankingExpression(mysummaryfeature).rankingScript"
+rankprofile[11].fef.property[3].value "80 * fieldMatch(title).completeness"
+rankprofile[11].fef.property[4].name "rankingExpression(mysummaryfeature2).rankingScript"
+rankprofile[11].fef.property[4].value "71 * fieldMatch(title).completeness"
+rankprofile[11].fef.property[5].name "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86).rankingScript"
+rankprofile[11].fef.property[5].value "4 * (match + match)"
+rankprofile[11].fef.property[6].name "vespa.rank.firstphase"
+rankprofile[11].fef.property[6].value "rankingExpression(firstphase)"
+rankprofile[11].fef.property[7].name "rankingExpression(firstphase).rankingScript"
+rankprofile[11].fef.property[7].value "20000 * rankingExpression(myfeature) + rankingExpression(mysummaryfeature)"
+rankprofile[11].fef.property[8].name "vespa.rank.secondphase"
+rankprofile[11].fef.property[8].value "rankingExpression(secondphase)"
+rankprofile[11].fef.property[9].name "rankingExpression(secondphase).rankingScript"
+rankprofile[11].fef.property[9].value "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86) + rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[11].fef.property[10].name "vespa.summary.feature"
+rankprofile[11].fef.property[10].value "rankingExpression(mysummaryfeature2)"
+rankprofile[11].fef.property[11].name "vespa.summary.feature"
+rankprofile[11].fef.property[11].value "rankingExpression(mysummaryfeature)"
+rankprofile[12].name "macros-inherited2"
+rankprofile[12].fef.property[0].name "foo"
+rankprofile[12].fef.property[0].value "some, list"
+rankprofile[12].fef.property[1].name "rankingExpression(fourtimessum).rankingScript"
+rankprofile[12].fef.property[1].value "4 * (var1 + var2)"
+rankprofile[12].fef.property[2].name "rankingExpression(myfeature).rankingScript"
+rankprofile[12].fef.property[2].value "70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness,2) + 30 * pow(0 - fieldMatch(description).earliness,2)"
+rankprofile[12].fef.property[3].name "rankingExpression(mysummaryfeature).rankingScript"
+rankprofile[12].fef.property[3].value "80 * fieldMatch(title).completeness"
+rankprofile[12].fef.property[4].name "rankingExpression(mysummaryfeature2).rankingScript"
+rankprofile[12].fef.property[4].value "71 * fieldMatch(title).completeness"
+rankprofile[12].fef.property[5].name "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86).rankingScript"
+rankprofile[12].fef.property[5].value "4 * (match + match)"
+rankprofile[12].fef.property[6].name "vespa.rank.firstphase"
+rankprofile[12].fef.property[6].value "rankingExpression(firstphase)"
+rankprofile[12].fef.property[7].name "rankingExpression(firstphase).rankingScript"
+rankprofile[12].fef.property[7].value "30000 * rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[12].fef.property[8].name "vespa.rank.secondphase"
+rankprofile[12].fef.property[8].value "rankingExpression(secondphase)"
+rankprofile[12].fef.property[9].name "rankingExpression(secondphase).rankingScript"
+rankprofile[12].fef.property[9].value "rankingExpression(fourtimessum@2b1138e8965e7ff5.67f1e87166cfef86) + rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[12].fef.property[10].name "vespa.summary.feature"
+rankprofile[12].fef.property[10].value "rankingExpression(mysummaryfeature2)"
+rankprofile[12].fef.property[11].name "vespa.summary.feature"
+rankprofile[12].fef.property[11].value "rankingExpression(mysummaryfeature)"
+rankprofile[13].name "macros-inherited3"
+rankprofile[13].fef.property[0].name "foo"
+rankprofile[13].fef.property[0].value "some, list"
+rankprofile[13].fef.property[1].name "rankingExpression(fourtimessum).rankingScript"
+rankprofile[13].fef.property[1].value "4 * (var1 + var2)"
+rankprofile[13].fef.property[2].name "rankingExpression(myfeature).rankingScript"
+rankprofile[13].fef.property[2].value "700 * fieldMatch(title).completeness"
+rankprofile[13].fef.property[3].name "rankingExpression(mysummaryfeature).rankingScript"
+rankprofile[13].fef.property[3].value "80 * fieldMatch(title).completeness"
+rankprofile[13].fef.property[4].name "rankingExpression(mysummaryfeature2).rankingScript"
+rankprofile[13].fef.property[4].value "71 * fieldMatch(title).completeness"
+rankprofile[13].fef.property[5].name "vespa.rank.firstphase"
+rankprofile[13].fef.property[5].value "rankingExpression(firstphase)"
+rankprofile[13].fef.property[6].name "rankingExpression(firstphase).rankingScript"
+rankprofile[13].fef.property[6].value "30000 * rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[13].fef.property[7].name "vespa.rank.secondphase"
+rankprofile[13].fef.property[7].value "rankingExpression(secondphase)"
+rankprofile[13].fef.property[8].name "rankingExpression(secondphase).rankingScript"
+rankprofile[13].fef.property[8].value "40000 * rankingExpression(mysummaryfeature) + rankingExpression(myfeature)"
+rankprofile[13].fef.property[9].name "vespa.summary.feature"
+rankprofile[13].fef.property[9].value "rankingExpression(mysummaryfeature2)"
+rankprofile[13].fef.property[10].name "vespa.summary.feature"
+rankprofile[13].fef.property[10].value "rankingExpression(mysummaryfeature)"
+rankprofile[14].name "macros-refering-macros"
+rankprofile[14].fef.property[0].name "rankingExpression(m1).rankingScript"
+rankprofile[14].fef.property[0].value "700 * fieldMatch(title).completeness"
+rankprofile[14].fef.property[1].name "rankingExpression(m2).rankingScript"
+rankprofile[14].fef.property[1].value "rankingExpression(m1) * 67"
+rankprofile[14].fef.property[2].name "rankingExpression(m4).rankingScript"
+rankprofile[14].fef.property[2].value "703 * fieldMatch(fromfile).completeness"
+rankprofile[14].fef.property[3].name "vespa.rank.secondphase"
+rankprofile[14].fef.property[3].value "rankingExpression(secondphase)"
+rankprofile[14].fef.property[4].name "rankingExpression(secondphase).rankingScript"
+rankprofile[14].fef.property[4].value "40000 * rankingExpression(m2)"
+rankprofile[15].name "macros-refering-macros-inherited"
+rankprofile[15].fef.property[0].name "rankingExpression(m1).rankingScript"
+rankprofile[15].fef.property[0].value "700 * fieldMatch(title).completeness"
+rankprofile[15].fef.property[1].name "rankingExpression(m2).rankingScript"
+rankprofile[15].fef.property[1].value "rankingExpression(m1) * 67"
+rankprofile[15].fef.property[2].name "rankingExpression(m4).rankingScript"
+rankprofile[15].fef.property[2].value "701 * fieldMatch(title).completeness"
+rankprofile[15].fef.property[3].name "rankingExpression(m3).rankingScript"
+rankprofile[15].fef.property[3].value "if (isNan(attribute(nrtgmp)) == 1, 0.0, rankingExpression(m2))"
+rankprofile[15].fef.property[4].name "vespa.rank.secondphase"
+rankprofile[15].fef.property[4].value "rankingExpression(secondphase)"
+rankprofile[15].fef.property[5].name "rankingExpression(secondphase).rankingScript"
+rankprofile[15].fef.property[5].value "3000 * rankingExpression(m2)"
+rankprofile[16].name "macros-refering-macros-inherited2"
+rankprofile[16].fef.property[0].name "rankingExpression(m1).rankingScript"
+rankprofile[16].fef.property[0].value "700 * fieldMatch(title).completeness"
+rankprofile[16].fef.property[1].name "rankingExpression(m2).rankingScript"
+rankprofile[16].fef.property[1].value "rankingExpression(m1) * 67"
+rankprofile[16].fef.property[2].name "rankingExpression(m4).rankingScript"
+rankprofile[16].fef.property[2].value "703 * fieldMatch(fromfile).completeness"
+rankprofile[16].fef.property[3].name "vespa.rank.secondphase"
+rankprofile[16].fef.property[3].value "rankingExpression(secondphase)"
+rankprofile[16].fef.property[4].name "rankingExpression(secondphase).rankingScript"
+rankprofile[16].fef.property[4].value "3002 * rankingExpression(m2)"
+rankprofile[17].name "macros-refering-macros-inherited-two-levels"
+rankprofile[17].fef.property[0].name "rankingExpression(m1).rankingScript"
+rankprofile[17].fef.property[0].value "700 * fieldMatch(title).completeness"
+rankprofile[17].fef.property[1].name "rankingExpression(m2).rankingScript"
+rankprofile[17].fef.property[1].value "rankingExpression(m1) * 67"
+rankprofile[17].fef.property[2].name "rankingExpression(m4).rankingScript"
+rankprofile[17].fef.property[2].value "701 * fieldMatch(title).completeness"
+rankprofile[17].fef.property[3].name "rankingExpression(m3).rankingScript"
+rankprofile[17].fef.property[3].value "if (isNan(attribute(nrtgmp)) == 1, 0.0, rankingExpression(m2))"
+rankprofile[17].fef.property[4].name "rankingExpression(m5).rankingScript"
+rankprofile[17].fef.property[4].value "if (isNan(attribute(glmpfw)) == 1, rankingExpression(m1), rankingExpression(m4))"
+rankprofile[17].fef.property[5].name "vespa.rank.secondphase"
+rankprofile[17].fef.property[5].value "rankingExpression(secondphase)"
+rankprofile[17].fef.property[6].name "rankingExpression(secondphase).rankingScript"
+rankprofile[17].fef.property[6].value "3000 * rankingExpression(m2)" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankexpression/rankexpression.expression b/config-model/src/test/derived/rankexpression/rankexpression.expression
new file mode 100644
index 00000000000..d6cb73c829d
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/rankexpression.expression
@@ -0,0 +1 @@
+if ( 3 > 2 , 10 , 24 ) + feature ( arg1 ) . out.out
diff --git a/config-model/src/test/derived/rankexpression/rankexpression.sd b/config-model/src/test/derived/rankexpression/rankexpression.sd
new file mode 100644
index 00000000000..139615bbd01
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/rankexpression.sd
@@ -0,0 +1,297 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search rankexpression {
+
+ document rankexpression {
+
+ field artist type string {
+ indexing: summary | index
+ # index-to: artist, default
+ }
+
+ field title type string {
+ indexing: summary | index
+ # index-to: title, default
+ }
+
+ field surl type string {
+ indexing: summary
+ }
+
+ field year type int {
+ indexing: summary | attribute
+ }
+
+ }
+
+ rank-profile default {
+ first-phase {
+ expression: classicRank
+ keep-rank-count: 20
+ rank-score-drop-limit: -0.5
+ }
+ second-phase {
+ expression: if(3>2,4,2)
+ rerank-count: 10
+ }
+ rank-features: attribute(foo1).out attribute(bar1.out)
+ rank-features { attribute(foo2).out attribute(bar2).out }
+ rank-features {
+ attribute(foo3).out attribute(bar3).out }
+ rank-features {
+ attribute(foo4).out
+ attribute(bar4).out
+ }
+ ignore-default-rank-features
+
+ rank-properties {
+ foo: "bar, baz"
+ qux: "quux"
+ foo: "foobar"
+ foo.bar: "foo.bar"
+ foo.bar.baz: 123
+ foo ( bar ) . baz.2 : 123.4
+ foo(bar).baz.qux: "foo(bar)"
+ "nud":"ity"
+ }
+
+ }
+
+ rank-profile static {
+ first-phase {
+ expression { attribute }
+ }
+ second-phase {
+ expression {
+ file:rankexpression
+ }
+ }
+ summary-features: attribute(foo1).out attribute(bar1.out)
+ summary-features { attribute(foo2).out attribute(bar2).out }
+ summary-features {
+ attribute(foo3).out attribute(bar3).out }
+ summary-features {
+ attribute(foo4).out
+ attribute(bar4).out
+ }
+ }
+
+ rank-profile overflow {
+ first-phase {
+ expression: file:overflow.expression
+ keep-rank-count: 201
+ rank-score-drop-limit: 501.5
+ }
+ second-phase {
+ expression {
+ exp(0) +
+ mysum(attribute(foo),
+ "attribute( bar )",
+ "attribute( \"baz\" )")
+ }
+ rerank-count: 101
+ }
+ }
+
+ rank-profile duplicates {
+ rank-properties {
+ fieldMatch(a).proximityLimit: 4
+ fieldMatch(a).proximityTable: 0.2
+ fieldMatch(a).proximityTable: 0.4
+ fieldMatch(a).proximityTable: 0.6
+ fieldMatch(a).proximityTable: 0.8
+ fieldMatch(a).proximityTable: 1
+ fieldMatch(a).proximityTable: 0.8
+ fieldMatch(a).proximityTable: 0.6
+ fieldMatch(a).proximityTable: 0.4
+ fieldMatch(a).proximityTable: 0.2
+ }
+ }
+
+ rank-profile whitespace1 {
+ first-phase {
+ expression
+ {
+
+ 1
+ }}}
+
+ rank-profile whitespace2 {
+ first-phase
+ {
+ expression { 1 }
+ }
+ }
+
+ rank-profile macros {
+ first-phase {
+ expression: match + fieldMatch(title) + myfeature
+ }
+ second-phase {
+ expression: fourtimessum(match,rankBoost)
+ }
+ macro fourtimessum(var1, var2) {
+ expression: 4*(var1+var2)
+ }
+ macro myfeature() {
+ expression {
+ 70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness, 2) +
+ 30 * pow(0 - fieldMatch(description).earliness, 2)
+ }
+ }
+ summary-features {
+ fieldMatch(title)
+ }
+ }
+
+ rank-profile macros2 {
+ first-phase {
+ expression: classicRank
+ }
+ rank-properties {
+ foo: "some, list"
+ }
+
+ second-phase {
+ expression: fourtimessum(match,match) + mysummaryfeature + myfeature
+ }
+ macro fourtimessum(var1, var2) {
+ expression: 4*(var1+var2)
+ }
+ macro myfeature() {
+ expression {
+ 70 * fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness, 2) +
+ 30 * pow(0 - fieldMatch(description).earliness, 2)
+ }
+ }
+ macro mysummaryfeature() {
+ expression {
+ 70 * fieldMatch(title).completeness
+ }
+ }
+ macro mysummaryfeature2() {
+ expression {
+ 71 * fieldMatch(title).completeness
+ }
+ }
+ summary-features {
+ mysummaryfeature
+ rankingExpression(mysummaryfeature2) # Required form earlier
+ }
+ }
+
+ rank-profile macros3 {
+ macro onlyusedinsummaryfeature() {
+ expression: 5
+ }
+ summary-features {
+ rankingExpression(matches(title,rankingExpression(onlyusedinsummaryfeature)))
+ }
+
+ }
+
+ rank-profile macros3-inherited inherits macros3 {
+ summary-features {
+ rankingExpression(matches(title,rankingExpression(onlyusedinsummaryfeature)))
+ }
+ }
+
+ rank-profile macros-inherited inherits macros2 {
+ macro mysummaryfeature() {
+ expression {
+ 80 * fieldMatch(title).completeness
+ }
+ }
+ first-phase {
+ expression {
+ 20000 * myfeature + mysummaryfeature
+ }
+ }
+ }
+
+ rank-profile macros-inherited2 inherits macros-inherited {
+ first-phase {
+ expression {
+ 30000 * mysummaryfeature + myfeature
+ }
+ }
+ }
+
+ rank-profile macros-inherited3 inherits macros-inherited2 {
+ macro myfeature() {
+ expression {
+ 700 * fieldMatch(title).completeness
+ }
+ }
+ second-phase {
+ expression {
+ 40000 * mysummaryfeature + myfeature
+ }
+ }
+ }
+
+ rank-profile macros-refering-macros {
+ macro m2() {
+ expression: m1 * 67
+ }
+
+ macro m1() {
+ expression {
+ 700 * fieldMatch(title).completeness
+ }
+ }
+
+ macro m4() {
+ expression: file:macro.expression
+ }
+
+ second-phase {
+ expression {
+ 40000 * m2
+ }
+ }
+
+ }
+
+ rank-profile macros-refering-macros-inherited inherits macros-refering-macros {
+ macro m3() {
+ expression {
+ if(isNan(attribute(nrtgmp))==1,
+ 0.0,
+ (m2)
+ )
+ }
+ }
+ macro m4() {
+ expression {
+ 701 * fieldMatch(title).completeness
+ }
+ }
+ second-phase {
+ expression {
+ 3000 * m2
+ }
+ }
+ }
+
+ rank-profile macros-refering-macros-inherited2 inherits macros-refering-macros {
+ second-phase {
+ expression {
+ 3002 * m2
+ }
+ }
+ }
+
+ rank-profile macros-refering-macros-inherited-two-levels inherits macros-refering-macros-inherited {
+ macro m5() {
+ expression {
+ if(isNan(attribute(glmpfw))==1,
+ m1,
+ (m4)
+ )
+ }
+ }
+ }
+
+}
+
+
diff --git a/config-model/src/test/derived/rankexpression/summary.cfg b/config-model/src/test/derived/rankexpression/summary.cfg
new file mode 100644
index 00000000000..00df2e87144
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/summary.cfg
@@ -0,0 +1,25 @@
+defaultsummaryid 1753207254
+classes[0].id 1753207254
+classes[0].name "default"
+classes[0].fields[0].name "artist"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "title"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "surl"
+classes[0].fields[2].type "longstring"
+classes[0].fields[3].name "year"
+classes[0].fields[3].type "integer"
+classes[0].fields[4].name "rankfeatures"
+classes[0].fields[4].type "featuredata"
+classes[0].fields[5].name "summaryfeatures"
+classes[0].fields[5].type "featuredata"
+classes[0].fields[6].name "documentid"
+classes[0].fields[6].type "longstring"
+classes[1].id 1787488393
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "year"
+classes[1].fields[0].type "integer"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].type "featuredata"
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankexpression/summarymap.cfg b/config-model/src/test/derived/rankexpression/summarymap.cfg
new file mode 100644
index 00000000000..c810f7282ba
--- /dev/null
+++ b/config-model/src/test/derived/rankexpression/summarymap.cfg
@@ -0,0 +1,10 @@
+defaultoutputclass -1
+override[0].field "year"
+override[0].command "attribute"
+override[0].arguments "year"
+override[1].field "rankfeatures"
+override[1].command "rankfeatures"
+override[1].arguments ""
+override[2].field "summaryfeatures"
+override[2].command "summaryfeatures"
+override[2].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankprofiles/rank-profiles.cfg b/config-model/src/test/derived/rankprofiles/rank-profiles.cfg
new file mode 100644
index 00000000000..da619d62a15
--- /dev/null
+++ b/config-model/src/test/derived/rankprofiles/rank-profiles.cfg
@@ -0,0 +1,98 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "other1"
+rankprofile[2].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.field1"
+rankprofile[2].fef.property[0].value "linear(0,0)"
+rankprofile[2].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.field1"
+rankprofile[2].fef.property[1].value "linear(0,0)"
+rankprofile[2].fef.property[2].name "nativeProximity.proximityTable.field1"
+rankprofile[2].fef.property[2].value "linear(0,0)"
+rankprofile[2].fef.property[3].name "nativeProximity.reverseProximityTable.field1"
+rankprofile[2].fef.property[3].value "linear(0,0)"
+rankprofile[2].fef.property[4].name "vespa.isfilterfield.field1"
+rankprofile[2].fef.property[4].value "true"
+rankprofile[3].name "other2"
+rankprofile[3].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.field1"
+rankprofile[3].fef.property[0].value "linear(0,0)"
+rankprofile[3].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.field1"
+rankprofile[3].fef.property[1].value "linear(0,0)"
+rankprofile[3].fef.property[2].name "nativeProximity.proximityTable.field1"
+rankprofile[3].fef.property[2].value "linear(0,0)"
+rankprofile[3].fef.property[3].name "nativeProximity.reverseProximityTable.field1"
+rankprofile[3].fef.property[3].value "linear(0,0)"
+rankprofile[3].fef.property[4].name "vespa.isfilterfield.field1"
+rankprofile[3].fef.property[4].value "true"
+rankprofile[4].name "other3"
+rankprofile[5].name "four"
+rankprofile[5].fef.property[0].name "vespa.matchphase.degradation.attribute"
+rankprofile[5].fef.property[0].value "field2"
+rankprofile[5].fef.property[1].name "vespa.matchphase.degradation.ascendingorder"
+rankprofile[5].fef.property[1].value "true"
+rankprofile[5].fef.property[2].name "vespa.matchphase.degradation.maxhits"
+rankprofile[5].fef.property[2].value "12345"
+rankprofile[5].fef.property[3].name "vespa.matchphase.degradation.maxfiltercoverage"
+rankprofile[5].fef.property[3].value "1.0"
+rankprofile[5].fef.property[4].name "vespa.matchphase.degradation.samplepercentage"
+rankprofile[5].fef.property[4].value "0.2"
+rankprofile[5].fef.property[5].name "vespa.matchphase.degradation.postfiltermultiplier"
+rankprofile[5].fef.property[5].value "1.0"
+rankprofile[6].name "five"
+rankprofile[6].fef.property[0].name "vespa.matchphase.degradation.attribute"
+rankprofile[6].fef.property[0].value "field2"
+rankprofile[6].fef.property[1].name "vespa.matchphase.degradation.ascendingorder"
+rankprofile[6].fef.property[1].value "false"
+rankprofile[6].fef.property[2].name "vespa.matchphase.degradation.maxhits"
+rankprofile[6].fef.property[2].value "54321"
+rankprofile[6].fef.property[3].name "vespa.matchphase.degradation.maxfiltercoverage"
+rankprofile[6].fef.property[3].value "1.0"
+rankprofile[6].fef.property[4].name "vespa.matchphase.degradation.samplepercentage"
+rankprofile[6].fef.property[4].value "0.2"
+rankprofile[6].fef.property[5].name "vespa.matchphase.degradation.postfiltermultiplier"
+rankprofile[6].fef.property[5].value "1.0"
+rankprofile[7].name "six"
+rankprofile[7].fef.property[0].name "vespa.matchphase.degradation.attribute"
+rankprofile[7].fef.property[0].value "field3"
+rankprofile[7].fef.property[1].name "vespa.matchphase.degradation.ascendingorder"
+rankprofile[7].fef.property[1].value "false"
+rankprofile[7].fef.property[2].name "vespa.matchphase.degradation.maxhits"
+rankprofile[7].fef.property[2].value "666"
+rankprofile[7].fef.property[3].name "vespa.matchphase.degradation.maxfiltercoverage"
+rankprofile[7].fef.property[3].value "1.0"
+rankprofile[7].fef.property[4].name "vespa.matchphase.degradation.samplepercentage"
+rankprofile[7].fef.property[4].value "0.2"
+rankprofile[7].fef.property[5].name "vespa.matchphase.degradation.postfiltermultiplier"
+rankprofile[7].fef.property[5].value "1.0"
+rankprofile[8].name "seven"
+rankprofile[8].fef.property[0].name "vespa.matchphase.degradation.attribute"
+rankprofile[8].fef.property[0].value "field3"
+rankprofile[8].fef.property[1].name "vespa.matchphase.degradation.ascendingorder"
+rankprofile[8].fef.property[1].value "false"
+rankprofile[8].fef.property[2].name "vespa.matchphase.degradation.maxhits"
+rankprofile[8].fef.property[2].value "800"
+rankprofile[8].fef.property[3].name "vespa.matchphase.degradation.maxfiltercoverage"
+rankprofile[8].fef.property[3].value "1.0"
+rankprofile[8].fef.property[4].name "vespa.matchphase.degradation.samplepercentage"
+rankprofile[8].fef.property[4].value "0.7"
+rankprofile[8].fef.property[5].name "vespa.matchphase.degradation.postfiltermultiplier"
+rankprofile[8].fef.property[5].value "3.4"
+rankprofile[9].name "eight"
+rankprofile[9].fef.property[0].name "vespa.matchphase.degradation.attribute"
+rankprofile[9].fef.property[0].value "field3"
+rankprofile[9].fef.property[1].name "vespa.matchphase.degradation.ascendingorder"
+rankprofile[9].fef.property[1].value "false"
+rankprofile[9].fef.property[2].name "vespa.matchphase.degradation.maxhits"
+rankprofile[9].fef.property[2].value "800"
+rankprofile[9].fef.property[3].name "vespa.matchphase.degradation.maxfiltercoverage"
+rankprofile[9].fef.property[3].value "1.0"
+rankprofile[9].fef.property[4].name "vespa.matchphase.degradation.samplepercentage"
+rankprofile[9].fef.property[4].value "0.7"
+rankprofile[9].fef.property[5].name "vespa.matchphase.degradation.postfiltermultiplier"
+rankprofile[9].fef.property[5].value "3.4" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankprofiles/rankprofiles.sd b/config-model/src/test/derived/rankprofiles/rankprofiles.sd
new file mode 100644
index 00000000000..ea3be070344
--- /dev/null
+++ b/config-model/src/test/derived/rankprofiles/rankprofiles.sd
@@ -0,0 +1,72 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search rankprofiles {
+
+ document rankprofiles {
+
+ field field1 type string {
+ indexing: index
+ }
+
+ field field2 type int {
+ indexing: attribute
+ attribute: fast-search
+ }
+
+ field field3 type int {
+ indexing: attribute
+ attribute: fast-search
+ }
+
+ }
+
+ rank-profile default {
+ }
+
+ rank-profile other1 inherits default {
+ rank field1: filter
+ rank none: filter
+ }
+
+ rank-profile other2 inherits other1 {
+ }
+
+ rank-profile other3 {
+ }
+
+ rank-profile four {
+ match-phase {
+ attribute: field2
+ order: ascending
+ max-hits: 12345
+ }
+ }
+
+ rank-profile five {
+ match-phase {
+ attribute: field2
+ order: descending
+ max-hits: 54321
+ }
+ }
+
+ rank-profile six {
+ match-phase {
+ attribute: field3
+ max-hits: 666
+ }
+ }
+
+ rank-profile seven {
+ match-phase {
+ attribute: field3
+ max-hits:800
+ evaluation-point:0.7
+ pre-post-filter-tipping-point:3.4
+ }
+ }
+
+ rank-profile eight inherits seven {
+
+ }
+
+}
diff --git a/config-model/src/test/derived/rankproperties/rank-profiles.cfg b/config-model/src/test/derived/rankproperties/rank-profiles.cfg
new file mode 100644
index 00000000000..147153c2f62
--- /dev/null
+++ b/config-model/src/test/derived/rankproperties/rank-profiles.cfg
@@ -0,0 +1,48 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "$test"
+rankprofile[0].fef.property[0].value "foo"
+rankprofile[0].fef.property[1].name "vespa.rank.firstphase"
+rankprofile[0].fef.property[1].value "nativeFieldMatch"
+rankprofile[0].fef.property[2].name "vespa.rank.secondphase"
+rankprofile[0].fef.property[2].value "match"
+rankprofile[0].fef.property[3].name "vespa.fieldweight.tag"
+rankprofile[0].fef.property[3].value "33"
+rankprofile[0].fef.property[4].name "vespa.fieldweight.title"
+rankprofile[0].fef.property[4].value "50"
+rankprofile[0].fef.property[5].name "vespa.fieldweight.description"
+rankprofile[0].fef.property[5].value "10"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "child"
+rankprofile[2].fef.property[0].name "$test"
+rankprofile[2].fef.property[0].value "foo"
+rankprofile[2].fef.property[1].name "vespa.rank.firstphase"
+rankprofile[2].fef.property[1].value "nativeFieldMatch"
+rankprofile[2].fef.property[2].name "vespa.rank.secondphase"
+rankprofile[2].fef.property[2].value "match"
+rankprofile[2].fef.property[3].name "vespa.fieldweight.title"
+rankprofile[2].fef.property[3].value "15"
+rankprofile[2].fef.property[4].name "vespa.fieldweight.tag"
+rankprofile[2].fef.property[4].value "33"
+rankprofile[2].fef.property[5].name "vespa.fieldweight.description"
+rankprofile[2].fef.property[5].value "10"
+rankprofile[3].name "standalone"
+rankprofile[3].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[3].fef.property[0].value "rankingExpression(firstphase)"
+rankprofile[3].fef.property[1].name "rankingExpression(firstphase).rankingScript"
+rankprofile[3].fef.property[1].value "match + fieldMatch(title)"
+rankprofile[3].fef.property[2].name "vespa.rank.secondphase"
+rankprofile[3].fef.property[2].value "rankingExpression(secondphase)"
+rankprofile[3].fef.property[3].name "rankingExpression(secondphase).rankingScript"
+rankprofile[3].fef.property[3].value "match + nativeFieldMatch"
+rankprofile[3].fef.property[4].name "vespa.fieldweight.description"
+rankprofile[3].fef.property[4].value "35"
+rankprofile[3].fef.property[5].name "vespa.fieldweight.tag"
+rankprofile[3].fef.property[5].value "88" \ No newline at end of file
diff --git a/config-model/src/test/derived/rankproperties/rankproperties.sd b/config-model/src/test/derived/rankproperties/rankproperties.sd
new file mode 100644
index 00000000000..80d5a0cef44
--- /dev/null
+++ b/config-model/src/test/derived/rankproperties/rankproperties.sd
@@ -0,0 +1,61 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search rankproperties {
+
+ document rankproperties {
+
+ field title type string {
+ indexing: index
+ weight: 50
+ }
+
+ field description type string {
+ indexing: index
+ weight: 10
+ }
+
+ field tag type string {
+ indexing: attribute
+ }
+
+ }
+
+ rank-profile default {
+ weight tag: 33
+ first-phase {
+ expression: nativeFieldMatch
+ }
+ second-phase {
+ expression: match
+ }
+ rank-properties {
+ $test:"foo"
+ #$weight:1
+ }
+ }
+
+ rank-profile child inherits default {
+ weight title: 15
+ #rank-properties {
+ # $test:"bar"
+ # $weight:2
+ #}
+ #first-phase {
+ # expression {
+ # $weight
+ # }
+ #}
+ }
+
+ rank-profile standalone {
+ weight description: 35
+ weight tag: 88
+
+ first-phase {
+ expression: match + fieldMatch(title)
+ }
+ second-phase {
+ expression: match + nativeFieldMatch
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/ranktypes/attributes.cfg b/config-model/src/test/derived/ranktypes/attributes.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/attributes.cfg
diff --git a/config-model/src/test/derived/ranktypes/documentmanager.cfg b/config-model/src/test/derived/ranktypes/documentmanager.cfg
new file mode 100644
index 00000000000..c57a58c244c
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/documentmanager.cfg
@@ -0,0 +1,51 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -471393776
+datatype[1].structtype[0].name "ranktypes.header"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "title"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "descr"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "keywords"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[1].structtype[0].field[3].name "identity"
+datatype[1].structtype[0].field[3].datatype 2
+datatype[1].structtype[0].field[4].name "identity_literal"
+datatype[1].structtype[0].field[4].datatype 2
+datatype[1].structtype[0].field[5].name "rankfeatures"
+datatype[1].structtype[0].field[5].datatype 2
+datatype[1].structtype[0].field[6].name "summaryfeatures"
+datatype[1].structtype[0].field[6].datatype 2
+datatype[2].id 1374506021
+datatype[2].structtype[0].name "ranktypes.body"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[3].id -883421617
+datatype[3].documenttype[0].name "ranktypes"
+datatype[3].documenttype[0].version 0
+datatype[3].documenttype[0].inherits[0].name "document"
+datatype[3].documenttype[0].inherits[0].version 0
+datatype[3].documenttype[0].headerstruct -471393776
+datatype[3].documenttype[0].bodystruct 1374506021
+datatype[3].documenttype[0].fieldsets{[document]}.fields[0] "descr"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[1] "identity"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[2] "keywords"
+datatype[3].documenttype[0].fieldsets{[document]}.fields[3] "title"
diff --git a/config-model/src/test/derived/ranktypes/ilscripts.cfg b/config-model/src/test/derived/ranktypes/ilscripts.cfg
new file mode 100644
index 00000000000..3a917099bfc
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/ilscripts.cfg
@@ -0,0 +1,11 @@
+maxtermoccurrences 100
+ilscript[0].doctype "ranktypes"
+ilscript[0].docfield[0] "title"
+ilscript[0].docfield[1] "descr"
+ilscript[0].docfield[2] "keywords"
+ilscript[0].docfield[3] "identity"
+ilscript[0].content[0] "clear_state | guard { input identity | tokenize | index identity_literal; }"
+ilscript[0].content[1] "clear_state | guard { input title | tokenize normalize stem:\"SHORTEST\" | summary title | index title; }"
+ilscript[0].content[2] "clear_state | guard { input descr | tokenize normalize stem:\"SHORTEST\" | summary descr | index descr; }"
+ilscript[0].content[3] "clear_state | guard { input keywords | tokenize normalize stem:\"SHORTEST\" | index keywords; }"
+ilscript[0].content[4] "clear_state | guard { input identity | tokenize normalize stem:\"SHORTEST\" | index identity; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/ranktypes/index-info.cfg b/config-model/src/test/derived/ranktypes/index-info.cfg
new file mode 100644
index 00000000000..464f7a73676
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/index-info.cfg
@@ -0,0 +1,47 @@
+indexinfo[0].name "ranktypes"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "title"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "title"
+indexinfo[0].command[3].command "lowercase"
+indexinfo[0].command[4].indexname "title"
+indexinfo[0].command[4].command "stem:SHORTEST"
+indexinfo[0].command[5].indexname "title"
+indexinfo[0].command[5].command "normalize"
+indexinfo[0].command[6].indexname "descr"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "descr"
+indexinfo[0].command[7].command "lowercase"
+indexinfo[0].command[8].indexname "descr"
+indexinfo[0].command[8].command "stem:SHORTEST"
+indexinfo[0].command[9].indexname "descr"
+indexinfo[0].command[9].command "normalize"
+indexinfo[0].command[10].indexname "keywords"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "keywords"
+indexinfo[0].command[11].command "lowercase"
+indexinfo[0].command[12].indexname "keywords"
+indexinfo[0].command[12].command "stem:SHORTEST"
+indexinfo[0].command[13].indexname "keywords"
+indexinfo[0].command[13].command "normalize"
+indexinfo[0].command[14].indexname "identity"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "identity"
+indexinfo[0].command[15].command "lowercase"
+indexinfo[0].command[16].indexname "identity"
+indexinfo[0].command[16].command "stem:SHORTEST"
+indexinfo[0].command[17].indexname "identity"
+indexinfo[0].command[17].command "normalize"
+indexinfo[0].command[18].indexname "identity"
+indexinfo[0].command[18].command "literal-boost"
+indexinfo[0].command[19].indexname "identity_literal"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "identity_literal"
+indexinfo[0].command[20].command "lowercase"
+indexinfo[0].command[21].indexname "rankfeatures"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "summaryfeatures"
+indexinfo[0].command[22].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/ranktypes/rank-profiles.cfg b/config-model/src/test/derived/ranktypes/rank-profiles.cfg
new file mode 100644
index 00000000000..aee11c0bbef
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/rank-profiles.cfg
@@ -0,0 +1,79 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.identity_literal"
+rankprofile[0].fef.property[0].value "linear(0,0)"
+rankprofile[0].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.identity_literal"
+rankprofile[0].fef.property[1].value "linear(0,0)"
+rankprofile[0].fef.property[2].name "nativeProximity.proximityTable.identity_literal"
+rankprofile[0].fef.property[2].value "linear(0,0)"
+rankprofile[0].fef.property[3].name "nativeProximity.reverseProximityTable.identity_literal"
+rankprofile[0].fef.property[3].value "linear(0,0)"
+rankprofile[0].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[0].fef.property[4].value "expdecay(100,12.50)"
+rankprofile[0].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[0].fef.property[5].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[6].name "nativeProximity.proximityTable.title"
+rankprofile[0].fef.property[6].value "expdecay(5000,3)"
+rankprofile[0].fef.property[7].name "nativeProximity.reverseProximityTable.title"
+rankprofile[0].fef.property[7].value "expdecay(3000,3)"
+rankprofile[0].fef.property[8].name "nativeFieldMatch.firstOccurrenceTable.descr"
+rankprofile[0].fef.property[8].value "expdecay(8000,12.50)"
+rankprofile[0].fef.property[9].name "nativeFieldMatch.occurrenceCountTable.descr"
+rankprofile[0].fef.property[9].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[10].name "nativeProximity.proximityTable.descr"
+rankprofile[0].fef.property[10].value "expdecay(500,3)"
+rankprofile[0].fef.property[11].name "nativeProximity.reverseProximityTable.descr"
+rankprofile[0].fef.property[11].value "expdecay(400,3)"
+rankprofile[0].fef.property[12].name "nativeFieldMatch.firstOccurrenceTable.keywords"
+rankprofile[0].fef.property[12].value "expdecay(8000,12.50)"
+rankprofile[0].fef.property[13].name "nativeFieldMatch.occurrenceCountTable.keywords"
+rankprofile[0].fef.property[13].value "loggrowth(1500,4000,19)"
+rankprofile[0].fef.property[14].name "nativeProximity.proximityTable.keywords"
+rankprofile[0].fef.property[14].value "expdecay(500,3)"
+rankprofile[0].fef.property[15].name "nativeProximity.reverseProximityTable.keywords"
+rankprofile[0].fef.property[15].value "expdecay(400,3)"
+rankprofile[0].fef.property[16].name "vespa.fieldweight.identity_literal"
+rankprofile[0].fef.property[16].value "200"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
+rankprofile[2].name "override"
+rankprofile[2].fef.property[0].name "nativeFieldMatch.firstOccurrenceTable.descr"
+rankprofile[2].fef.property[0].value "expdecay(100,12.50)"
+rankprofile[2].fef.property[1].name "nativeFieldMatch.occurrenceCountTable.descr"
+rankprofile[2].fef.property[1].value "loggrowth(1500,4000,19)"
+rankprofile[2].fef.property[2].name "nativeProximity.proximityTable.descr"
+rankprofile[2].fef.property[2].value "expdecay(5000,3)"
+rankprofile[2].fef.property[3].name "nativeProximity.reverseProximityTable.descr"
+rankprofile[2].fef.property[3].value "expdecay(3000,3)"
+rankprofile[2].fef.property[4].name "nativeFieldMatch.firstOccurrenceTable.identity_literal"
+rankprofile[2].fef.property[4].value "linear(0,0)"
+rankprofile[2].fef.property[5].name "nativeFieldMatch.occurrenceCountTable.identity_literal"
+rankprofile[2].fef.property[5].value "linear(0,0)"
+rankprofile[2].fef.property[6].name "nativeProximity.proximityTable.identity_literal"
+rankprofile[2].fef.property[6].value "linear(0,0)"
+rankprofile[2].fef.property[7].name "nativeProximity.reverseProximityTable.identity_literal"
+rankprofile[2].fef.property[7].value "linear(0,0)"
+rankprofile[2].fef.property[8].name "nativeFieldMatch.firstOccurrenceTable.title"
+rankprofile[2].fef.property[8].value "expdecay(100,12.50)"
+rankprofile[2].fef.property[9].name "nativeFieldMatch.occurrenceCountTable.title"
+rankprofile[2].fef.property[9].value "loggrowth(1500,4000,19)"
+rankprofile[2].fef.property[10].name "nativeProximity.proximityTable.title"
+rankprofile[2].fef.property[10].value "expdecay(5000,3)"
+rankprofile[2].fef.property[11].name "nativeProximity.reverseProximityTable.title"
+rankprofile[2].fef.property[11].value "expdecay(3000,3)"
+rankprofile[2].fef.property[12].name "nativeFieldMatch.firstOccurrenceTable.keywords"
+rankprofile[2].fef.property[12].value "expdecay(8000,12.50)"
+rankprofile[2].fef.property[13].name "nativeFieldMatch.occurrenceCountTable.keywords"
+rankprofile[2].fef.property[13].value "loggrowth(1500,4000,19)"
+rankprofile[2].fef.property[14].name "nativeProximity.proximityTable.keywords"
+rankprofile[2].fef.property[14].value "expdecay(500,3)"
+rankprofile[2].fef.property[15].name "nativeProximity.reverseProximityTable.keywords"
+rankprofile[2].fef.property[15].value "expdecay(400,3)"
+rankprofile[2].fef.property[16].name "vespa.fieldweight.identity_literal"
+rankprofile[2].fef.property[16].value "200" \ No newline at end of file
diff --git a/config-model/src/test/derived/ranktypes/ranktypes.sd b/config-model/src/test/derived/ranktypes/ranktypes.sd
new file mode 100644
index 00000000000..e9fc8606e4c
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/ranktypes.sd
@@ -0,0 +1,32 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search ranktypes {
+
+ document ranktypes {
+
+ field title type string {
+ indexing: summary | index
+ rank-type: identity
+ }
+
+ field descr type string {
+ indexing: summary | index
+ rank-type: about
+ }
+
+ field keywords type string {
+ indexing: index
+ rank-type: tags
+ }
+
+ field identity type string {
+ indexing: index
+ rank: literal
+ }
+
+ }
+
+ rank-profile override inherits default {
+ rank-type descr: identity
+ }
+
+}
diff --git a/config-model/src/test/derived/ranktypes/summary.cfg b/config-model/src/test/derived/ranktypes/summary.cfg
new file mode 100644
index 00000000000..aaf8398b303
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/summary.cfg
@@ -0,0 +1,13 @@
+defaultsummaryid 1567556360
+classes[0].id 1567556360
+classes[0].name "default"
+classes[0].fields[0].name "title"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "descr"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "rankfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "summaryfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "documentid"
+classes[0].fields[4].type "longstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/ranktypes/summarymap.cfg b/config-model/src/test/derived/ranktypes/summarymap.cfg
new file mode 100644
index 00000000000..42b6e811ee6
--- /dev/null
+++ b/config-model/src/test/derived/ranktypes/summarymap.cfg
@@ -0,0 +1,7 @@
+defaultoutputclass -1
+override[0].field "rankfeatures"
+override[0].command "rankfeatures"
+override[0].arguments ""
+override[1].field "summaryfeatures"
+override[1].command "summaryfeatures"
+override[1].arguments "" \ No newline at end of file
diff --git a/config-model/src/test/derived/reserved_position/reserved_position.sd b/config-model/src/test/derived/reserved_position/reserved_position.sd
new file mode 100644
index 00000000000..bee62a646bf
--- /dev/null
+++ b/config-model/src/test/derived/reserved_position/reserved_position.sd
@@ -0,0 +1,4 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search position {
+ document position { }
+}
diff --git a/config-model/src/test/derived/sorting/attributes.cfg b/config-model/src/test/derived/sorting/attributes.cfg
new file mode 100644
index 00000000000..c65271c618a
--- /dev/null
+++ b/config-model/src/test/derived/sorting/attributes.cfg
@@ -0,0 +1,57 @@
+attribute[0].name "syntaxcheck"
+attribute[0].datatype STRING
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending false
+attribute[0].sortfunction LOWERCASE
+attribute[0].sortstrength IDENTICAL
+attribute[0].sortlocale "en_US"
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "syntaxcheck2"
+attribute[1].datatype STRING
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending false
+attribute[1].sortfunction LOWERCASE
+attribute[1].sortstrength IDENTICAL
+attribute[1].sortlocale "en_US"
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "infieldonly"
+attribute[2].datatype STRING
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending false
+attribute[2].sortfunction LOWERCASE
+attribute[2].sortstrength SECONDARY
+attribute[2].sortlocale "en_US"
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype "" \ No newline at end of file
diff --git a/config-model/src/test/derived/sorting/sorting.sd b/config-model/src/test/derived/sorting/sorting.sd
new file mode 100644
index 00000000000..c67222a56ed
--- /dev/null
+++ b/config-model/src/test/derived/sorting/sorting.sd
@@ -0,0 +1,53 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search sorting {
+
+ document sorting {
+
+ field syntaxcheck type string {
+ indexing: attribute
+ attribute {
+ sorting: ascending
+ sorting: descending
+ sorting: function: uca
+ sorting: function: raw
+ sorting: function: lowercase
+ sorting: strength: primary
+ sorting: strength: secondary
+ sorting: strength: tertiary
+ sorting: strength: quaternary
+ sorting: strength: identical
+ sorting: locale: en_US
+ }
+ }
+
+ field syntaxcheck2 type string {
+ indexing: attribute
+ attribute {
+ sorting {
+ ascending
+ descending
+ function: uca
+ function: raw
+ function: lowercase
+ strength: primary
+ strength: secondary
+ strength: tertiary
+ strength: quaternary
+ strength: identical
+ locale: en_US
+ }
+ }
+ }
+
+ field infieldonly type string {
+ indexing: attribute
+ sorting {
+ descending
+ function: lowercase
+ strength: secondary
+ locale: en_US
+ }
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/streamingjuniper/streamingjuniper.sd b/config-model/src/test/derived/streamingjuniper/streamingjuniper.sd
new file mode 100644
index 00000000000..b7fb367112a
--- /dev/null
+++ b/config-model/src/test/derived/streamingjuniper/streamingjuniper.sd
@@ -0,0 +1,15 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search streamingjuniper {
+ document streamingjuniper {
+ field f1 type string {
+ indexing: index | summary
+ header
+ bolding: on
+ }
+ field f2 type string {
+ indexing: index | summary
+ header
+ summary: dynamic
+ }
+ }
+}
diff --git a/config-model/src/test/derived/streamingjuniper/vsmsummary.cfg b/config-model/src/test/derived/streamingjuniper/vsmsummary.cfg
new file mode 100644
index 00000000000..939f3453e3b
--- /dev/null
+++ b/config-model/src/test/derived/streamingjuniper/vsmsummary.cfg
@@ -0,0 +1,11 @@
+outputclass ""
+fieldmap[0].summary "f1"
+fieldmap[0].document[0].field "f1"
+fieldmap[0].command FLATTENJUNIPER
+fieldmap[1].summary "f2"
+fieldmap[1].document[0].field "f2"
+fieldmap[1].command FLATTENJUNIPER
+fieldmap[2].summary "rankfeatures"
+fieldmap[2].command NONE
+fieldmap[3].summary "summaryfeatures"
+fieldmap[3].command NONE \ No newline at end of file
diff --git a/config-model/src/test/derived/streamingstruct/documentmanager.cfg b/config-model/src/test/derived/streamingstruct/documentmanager.cfg
new file mode 100644
index 00000000000..306f1102fb1
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/documentmanager.cfg
@@ -0,0 +1,127 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 105061838
+datatype[1].structtype[0].name "ns1"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "nf1"
+datatype[1].structtype[0].field[0].datatype 3474528
+datatype[1].structtype[0].field[1].name "nf1s"
+datatype[1].structtype[0].field[1].datatype 3474528
+datatype[1].structtype[0].field[2].name "nf2"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[2].id 3474528
+datatype[2].structtype[0].name "s1"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "f1"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "f1s"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[2].name "f2"
+datatype[2].structtype[0].field[2].datatype 0
+datatype[2].structtype[0].field[3].name "f3"
+datatype[2].structtype[0].field[3].datatype 5
+datatype[3].id -1497802371
+datatype[3].maptype[0].keytype 4
+datatype[3].maptype[0].valtype 2
+datatype[4].id -1425630723
+datatype[4].arraytype[0].datatype 3474528
+datatype[5].id 731395686
+datatype[5].structtype[0].name "streamingstruct.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "coupleof"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[1].name "normalfields"
+datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[2].name "a"
+datatype[5].structtype[0].field[2].datatype 3474528
+datatype[5].structtype[0].field[3].name "m"
+datatype[5].structtype[0].field[3].datatype -1497802371
+datatype[5].structtype[0].field[4].name "b"
+datatype[5].structtype[0].field[4].datatype 3474528
+datatype[5].structtype[0].field[5].name "c"
+datatype[5].structtype[0].field[5].datatype 3474528
+datatype[5].structtype[0].field[6].name "c2"
+datatype[5].structtype[0].field[6].datatype 3474528
+datatype[5].structtype[0].field[7].name "c3"
+datatype[5].structtype[0].field[7].datatype 3474528
+datatype[5].structtype[0].field[8].name "n"
+datatype[5].structtype[0].field[8].datatype 105061838
+datatype[5].structtype[0].field[9].name "array1"
+datatype[5].structtype[0].field[9].datatype -1425630723
+datatype[5].structtype[0].field[10].name "array2"
+datatype[5].structtype[0].field[10].datatype -1425630723
+datatype[5].structtype[0].field[11].name "array3"
+datatype[5].structtype[0].field[11].datatype -1425630723
+datatype[5].structtype[0].field[12].name "subject"
+datatype[5].structtype[0].field[12].datatype 3474528
+datatype[5].structtype[0].field[13].name "d"
+datatype[5].structtype[0].field[13].datatype 3474528
+datatype[5].structtype[0].field[14].name "e"
+datatype[5].structtype[0].field[14].datatype 3474528
+datatype[5].structtype[0].field[15].name "f"
+datatype[5].structtype[0].field[15].datatype 3474528
+datatype[5].structtype[0].field[16].name "g"
+datatype[5].structtype[0].field[16].datatype 2
+datatype[5].structtype[0].field[17].name "anothersummaryfield"
+datatype[5].structtype[0].field[17].datatype 2
+datatype[5].structtype[0].field[18].name "rankfeatures"
+datatype[5].structtype[0].field[18].datatype 2
+datatype[5].structtype[0].field[19].name "summaryfeatures"
+datatype[5].structtype[0].field[19].datatype 2
+datatype[5].structtype[0].field[20].name "snippet"
+datatype[5].structtype[0].field[20].datatype 2
+datatype[5].structtype[0].field[21].name "snippet2"
+datatype[5].structtype[0].field[21].datatype 2
+datatype[6].id 1858438651
+datatype[6].structtype[0].name "streamingstruct.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id 1433175737
+datatype[7].documenttype[0].name "streamingstruct"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].headerstruct 731395686
+datatype[7].documenttype[0].bodystruct 1858438651
+datatype[7].documenttype[0].fieldsets{[document]}.fields[0] "a"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[1] "array1"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[2] "array2"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[3] "array3"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[4] "b"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[5] "c"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[6] "c2"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[7] "c3"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[8] "coupleof"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[9] "d"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[10] "e"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[11] "f"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[12] "g"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[13] "m"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[14] "n"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[15] "normalfields"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[16] "subject"
diff --git a/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg b/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg
new file mode 100644
index 00000000000..fc9b0e315b8
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/onlydoc/documentmanager.cfg
@@ -0,0 +1,100 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 105061838
+datatype[1].structtype[0].name "ns1"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "nf1"
+datatype[1].structtype[0].field[0].datatype 3474528
+datatype[1].structtype[0].field[1].name "nf1s"
+datatype[1].structtype[0].field[1].datatype 3474528
+datatype[1].structtype[0].field[2].name "nf2"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[2].id 3474528
+datatype[2].structtype[0].name "s1"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "f1"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "f1s"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[2].name "f2"
+datatype[2].structtype[0].field[2].datatype 0
+datatype[2].structtype[0].field[3].name "f3"
+datatype[2].structtype[0].field[3].datatype 5
+datatype[3].id -1497802371
+datatype[3].maptype[0].keytype 4
+datatype[3].maptype[0].valtype 2
+datatype[4].id -1425630723
+datatype[4].arraytype[0].datatype 3474528
+datatype[5].id 731395686
+datatype[5].structtype[0].name "streamingstruct.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "coupleof"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[1].name "normalfields"
+datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[2].name "a"
+datatype[5].structtype[0].field[2].datatype 3474528
+datatype[5].structtype[0].field[3].name "m"
+datatype[5].structtype[0].field[3].datatype -1497802371
+datatype[5].structtype[0].field[4].name "b"
+datatype[5].structtype[0].field[4].datatype 3474528
+datatype[5].structtype[0].field[5].name "c"
+datatype[5].structtype[0].field[5].datatype 3474528
+datatype[5].structtype[0].field[6].name "c2"
+datatype[5].structtype[0].field[6].datatype 3474528
+datatype[5].structtype[0].field[7].name "c3"
+datatype[5].structtype[0].field[7].datatype 3474528
+datatype[5].structtype[0].field[8].name "n"
+datatype[5].structtype[0].field[8].datatype 105061838
+datatype[5].structtype[0].field[9].name "array1"
+datatype[5].structtype[0].field[9].datatype -1425630723
+datatype[5].structtype[0].field[10].name "array2"
+datatype[5].structtype[0].field[10].datatype -1425630723
+datatype[5].structtype[0].field[11].name "array3"
+datatype[5].structtype[0].field[11].datatype -1425630723
+datatype[5].structtype[0].field[12].name "subject"
+datatype[5].structtype[0].field[12].datatype 3474528
+datatype[5].structtype[0].field[13].name "d"
+datatype[5].structtype[0].field[13].datatype 3474528
+datatype[5].structtype[0].field[14].name "e"
+datatype[5].structtype[0].field[14].datatype 3474528
+datatype[5].structtype[0].field[15].name "f"
+datatype[5].structtype[0].field[15].datatype 3474528
+datatype[5].structtype[0].field[16].name "g"
+datatype[5].structtype[0].field[16].datatype 2
+datatype[6].id 1858438651
+datatype[6].structtype[0].name "streamingstruct.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id 1433175737
+datatype[7].documenttype[0].name "streamingstruct"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].headerstruct 731395686
+datatype[7].documenttype[0].bodystruct 1858438651
diff --git a/config-model/src/test/derived/streamingstruct/streamingstruct.sd b/config-model/src/test/derived/streamingstruct/streamingstruct.sd
new file mode 100644
index 00000000000..c90afef3e46
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/streamingstruct.sd
@@ -0,0 +1,184 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search streamingstruct {
+
+ document streamingstruct {
+ field coupleof type string {
+ indexing: index | summary
+ }
+
+ field normalfields type string {
+ indexing: index | summary
+ summary anothersummaryfield {
+ source: normalfields
+ }
+ }
+
+ struct s1 {
+ field f1 type string { }
+ field f1s type string { match: substring }
+ field f2 type int { }
+ field f3 type double { }
+ # Allow default matchtypes in struct. Can be overridden.
+ # No index/attribute related stuff. It is only a datatype definition.
+ }
+ struct ns1 {
+ field nf1 type s1 { }
+ field nf1s type s1 { match: substring }
+ field nf2 type string { }
+ # May specify nested structs.
+ }
+
+ field a type s1 {
+ indexing: summary
+ # Will generate attribute a.f1, a.f1s, a.f2, a.f3
+ # with datatypes preserved.
+ # No customisation.
+ # a will be a synonym for all (a.*)
+ }
+ field m type map<long, string> {
+ indexing: summary
+ # Will generate attribute m.key, m.value
+ # with datatypes preserved.
+ # m will be a synonym for all (m.*)
+ }
+ field b type s1 {
+ indexing: index | summary
+ # Will generate index b.f1, b.f1s, b.f2, b.f3
+ # with datatypes preserved if backend allows.
+ # No customisation.
+ # b will be synonym for all (b.*).
+ }
+ field c type s1 {
+ struct-field f1 {
+ # Whatever you normally write in a field declaration
+ indexing: attribute | summary # -> Generates attribute c.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> c.f1s
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index | summary # -> c.f3
+ }
+ # attribute c will be synonym for c.f1.
+ # Index c will be synonym for c.f1s OR c.f3.
+ # Indexed search can handle that however they want.
+ }
+ field c2 type s1 {
+ struct-field f1 {
+ # Whatever you normally write in a field declaration
+ indexing: attribute | summary # -> Generates attribute c2.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> c2.f1s
+ match: suffix
+ }
+ struct-field f2 {
+ indexing: index | summary # -> c2.f2
+ }
+ struct-field f3 {
+ indexing: index | summary # -> c2.f3
+ }
+ }
+ field c3 type s1 {
+ # Uses all sub fields, but not summary for all.
+ struct-field f1 {
+ indexing: attribute | summary
+ }
+ struct-field f1s {
+ indexing: index
+ match: prefix
+ }
+ struct-field f2 {
+ indexing: index | summary
+ }
+ struct-field f3 {
+ indexing: index | summary
+ }
+ }
+ field n type ns1 {
+ struct-field nf1 {
+ struct-field f1 {
+ indexing: index | summary
+ }
+ struct-field f1s {
+ indexing: index | summary
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index
+ }
+ }
+ struct-field nf1s {
+ indexing: index | summary
+ }
+ struct-field nf2 {
+ indexing: index | summary
+ }
+ # Will generate indexes n.nf1.f1, n.nf1.f1s, n.nf1.f3,
+ # n.nf1s.f1, n.nf1s.f1s, n.nf1s.f2, n.nf1s.f3
+ # and n.nf2.
+ # n will be synonym for all 8,
+ # n.nf1 will be synonym for the first 3 and
+ # n.nf1s will be synonym for the next 4
+ }
+
+ field array1 type array<s1> {
+ indexing: summary
+ }
+ field array2 type array<s1> {
+ indexing: index | summary
+ }
+ field array3 type array<s1> {
+ struct-field f1 {
+ indexing: attribute | summary # -> Generates attribute array3.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> array3.f1s
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index | summary # -> array3.f3
+ }
+ }
+
+ field subject type s1 {
+ struct-field f1 {
+ indexing: summary
+ summary subject {
+ source:subject.f1
+ }
+ }
+ }
+ field d type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: prefix
+ }
+ field e type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: substring
+ }
+ field f type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: suffix
+ }
+ field g type string {
+ indexing: index | summary
+ summary: dynamic
+ }
+ }
+
+ document-summary summ {
+ summary snippet type string {
+ dynamic
+ source: a.f1, b.f2
+ }
+ summary snippet2 type string {
+ source: a.f1, b.f1, b.f2
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/streamingstruct/summary.cfg b/config-model/src/test/derived/streamingstruct/summary.cfg
new file mode 100644
index 00000000000..9d722116850
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/summary.cfg
@@ -0,0 +1,51 @@
+defaultsummaryid 569269436
+classes[0].id 569269436
+classes[0].name "default"
+classes[0].fields[0].name "coupleof"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "anothersummaryfield"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "a"
+classes[0].fields[2].type "jsonstring"
+classes[0].fields[3].name "m"
+classes[0].fields[3].type "jsonstring"
+classes[0].fields[4].name "b"
+classes[0].fields[4].type "jsonstring"
+classes[0].fields[5].name "c"
+classes[0].fields[5].type "jsonstring"
+classes[0].fields[6].name "c2"
+classes[0].fields[6].type "jsonstring"
+classes[0].fields[7].name "c3"
+classes[0].fields[7].type "jsonstring"
+classes[0].fields[8].name "n"
+classes[0].fields[8].type "jsonstring"
+classes[0].fields[9].name "array1"
+classes[0].fields[9].type "jsonstring"
+classes[0].fields[10].name "array2"
+classes[0].fields[10].type "jsonstring"
+classes[0].fields[11].name "array3"
+classes[0].fields[11].type "jsonstring"
+classes[0].fields[12].name "subject"
+classes[0].fields[12].type "jsonstring"
+classes[0].fields[13].name "g"
+classes[0].fields[13].type "longstring"
+classes[0].fields[14].name "rankfeatures"
+classes[0].fields[14].type "featuredata"
+classes[0].fields[15].name "summaryfeatures"
+classes[0].fields[15].type "featuredata"
+classes[0].fields[16].name "snippet"
+classes[0].fields[16].type "longstring"
+classes[0].fields[17].name "snippet2"
+classes[0].fields[17].type "longstring"
+classes[0].fields[18].name "documentid"
+classes[0].fields[18].type "longstring"
+classes[1].id 109252281
+classes[1].name "summ"
+classes[1].fields[0].name "snippet"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "snippet2"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "rankfeatures"
+classes[1].fields[2].type "featuredata"
+classes[1].fields[3].name "summaryfeatures"
+classes[1].fields[3].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/streamingstruct/summarymap.cfg b/config-model/src/test/derived/streamingstruct/summarymap.cfg
new file mode 100644
index 00000000000..1bf13ffa199
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/summarymap.cfg
@@ -0,0 +1,13 @@
+defaultoutputclass -1
+override[0].field "snippet"
+override[0].command "dynamicteaser"
+override[0].arguments "snippet"
+override[1].field "rankfeatures"
+override[1].command "rankfeatures"
+override[1].arguments ""
+override[2].field "summaryfeatures"
+override[2].command "summaryfeatures"
+override[2].arguments ""
+override[3].field "g"
+override[3].command "dynamicteaser"
+override[3].arguments "g" \ No newline at end of file
diff --git a/config-model/src/test/derived/streamingstruct/vsmfields.cfg b/config-model/src/test/derived/streamingstruct/vsmfields.cfg
new file mode 100644
index 00000000000..abfd90820cc
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/vsmfields.cfg
@@ -0,0 +1,434 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "coupleof"
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 ""
+fieldspec[0].maxlength 1048576
+fieldspec[0].fieldtype INDEX
+fieldspec[1].name "normalfields"
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 ""
+fieldspec[1].maxlength 1048576
+fieldspec[1].fieldtype INDEX
+fieldspec[2].name "a.f1"
+fieldspec[2].searchmethod AUTOUTF8
+fieldspec[2].arg1 ""
+fieldspec[2].maxlength 1048576
+fieldspec[2].fieldtype INDEX
+fieldspec[3].name "a.f1s"
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 "substring"
+fieldspec[3].maxlength 1048576
+fieldspec[3].fieldtype INDEX
+fieldspec[4].name "a.f2"
+fieldspec[4].searchmethod INT32
+fieldspec[4].arg1 ""
+fieldspec[4].maxlength 1048576
+fieldspec[4].fieldtype INDEX
+fieldspec[5].name "a.f3"
+fieldspec[5].searchmethod DOUBLE
+fieldspec[5].arg1 ""
+fieldspec[5].maxlength 1048576
+fieldspec[5].fieldtype INDEX
+fieldspec[6].name "m.key"
+fieldspec[6].searchmethod INT64
+fieldspec[6].arg1 ""
+fieldspec[6].maxlength 1048576
+fieldspec[6].fieldtype INDEX
+fieldspec[7].name "m.value"
+fieldspec[7].searchmethod AUTOUTF8
+fieldspec[7].arg1 ""
+fieldspec[7].maxlength 1048576
+fieldspec[7].fieldtype INDEX
+fieldspec[8].name "b.f1"
+fieldspec[8].searchmethod AUTOUTF8
+fieldspec[8].arg1 ""
+fieldspec[8].maxlength 1048576
+fieldspec[8].fieldtype INDEX
+fieldspec[9].name "b.f1s"
+fieldspec[9].searchmethod AUTOUTF8
+fieldspec[9].arg1 "substring"
+fieldspec[9].maxlength 1048576
+fieldspec[9].fieldtype INDEX
+fieldspec[10].name "b.f2"
+fieldspec[10].searchmethod INT32
+fieldspec[10].arg1 ""
+fieldspec[10].maxlength 1048576
+fieldspec[10].fieldtype INDEX
+fieldspec[11].name "b.f3"
+fieldspec[11].searchmethod DOUBLE
+fieldspec[11].arg1 ""
+fieldspec[11].maxlength 1048576
+fieldspec[11].fieldtype INDEX
+fieldspec[12].name "c.f1"
+fieldspec[12].searchmethod AUTOUTF8
+fieldspec[12].arg1 ""
+fieldspec[12].maxlength 1048576
+fieldspec[12].fieldtype ATTRIBUTE
+fieldspec[13].name "c.f1s"
+fieldspec[13].searchmethod AUTOUTF8
+fieldspec[13].arg1 "prefix"
+fieldspec[13].maxlength 1048576
+fieldspec[13].fieldtype INDEX
+fieldspec[14].name "c.f3"
+fieldspec[14].searchmethod DOUBLE
+fieldspec[14].arg1 ""
+fieldspec[14].maxlength 1048576
+fieldspec[14].fieldtype INDEX
+fieldspec[15].name "c2.f1"
+fieldspec[15].searchmethod AUTOUTF8
+fieldspec[15].arg1 ""
+fieldspec[15].maxlength 1048576
+fieldspec[15].fieldtype ATTRIBUTE
+fieldspec[16].name "c2.f1s"
+fieldspec[16].searchmethod AUTOUTF8
+fieldspec[16].arg1 "suffix"
+fieldspec[16].maxlength 1048576
+fieldspec[16].fieldtype INDEX
+fieldspec[17].name "c2.f2"
+fieldspec[17].searchmethod INT32
+fieldspec[17].arg1 ""
+fieldspec[17].maxlength 1048576
+fieldspec[17].fieldtype INDEX
+fieldspec[18].name "c2.f3"
+fieldspec[18].searchmethod DOUBLE
+fieldspec[18].arg1 ""
+fieldspec[18].maxlength 1048576
+fieldspec[18].fieldtype INDEX
+fieldspec[19].name "c3.f1"
+fieldspec[19].searchmethod AUTOUTF8
+fieldspec[19].arg1 ""
+fieldspec[19].maxlength 1048576
+fieldspec[19].fieldtype ATTRIBUTE
+fieldspec[20].name "c3.f1s"
+fieldspec[20].searchmethod AUTOUTF8
+fieldspec[20].arg1 "prefix"
+fieldspec[20].maxlength 1048576
+fieldspec[20].fieldtype INDEX
+fieldspec[21].name "c3.f2"
+fieldspec[21].searchmethod INT32
+fieldspec[21].arg1 ""
+fieldspec[21].maxlength 1048576
+fieldspec[21].fieldtype INDEX
+fieldspec[22].name "c3.f3"
+fieldspec[22].searchmethod DOUBLE
+fieldspec[22].arg1 ""
+fieldspec[22].maxlength 1048576
+fieldspec[22].fieldtype INDEX
+fieldspec[23].name "n.nf1.f1"
+fieldspec[23].searchmethod AUTOUTF8
+fieldspec[23].arg1 ""
+fieldspec[23].maxlength 1048576
+fieldspec[23].fieldtype INDEX
+fieldspec[24].name "n.nf1.f1s"
+fieldspec[24].searchmethod AUTOUTF8
+fieldspec[24].arg1 "prefix"
+fieldspec[24].maxlength 1048576
+fieldspec[24].fieldtype INDEX
+fieldspec[25].name "n.nf1.f3"
+fieldspec[25].searchmethod DOUBLE
+fieldspec[25].arg1 ""
+fieldspec[25].maxlength 1048576
+fieldspec[25].fieldtype INDEX
+fieldspec[26].name "n.nf1s.f1"
+fieldspec[26].searchmethod AUTOUTF8
+fieldspec[26].arg1 "substring"
+fieldspec[26].maxlength 1048576
+fieldspec[26].fieldtype INDEX
+fieldspec[27].name "n.nf1s.f1s"
+fieldspec[27].searchmethod AUTOUTF8
+fieldspec[27].arg1 "substring"
+fieldspec[27].maxlength 1048576
+fieldspec[27].fieldtype INDEX
+fieldspec[28].name "n.nf1s.f2"
+fieldspec[28].searchmethod INT32
+fieldspec[28].arg1 ""
+fieldspec[28].maxlength 1048576
+fieldspec[28].fieldtype INDEX
+fieldspec[29].name "n.nf1s.f3"
+fieldspec[29].searchmethod DOUBLE
+fieldspec[29].arg1 ""
+fieldspec[29].maxlength 1048576
+fieldspec[29].fieldtype INDEX
+fieldspec[30].name "n.nf2"
+fieldspec[30].searchmethod AUTOUTF8
+fieldspec[30].arg1 ""
+fieldspec[30].maxlength 1048576
+fieldspec[30].fieldtype INDEX
+fieldspec[31].name "array1.f1"
+fieldspec[31].searchmethod AUTOUTF8
+fieldspec[31].arg1 ""
+fieldspec[31].maxlength 1048576
+fieldspec[31].fieldtype INDEX
+fieldspec[32].name "array1.f1s"
+fieldspec[32].searchmethod AUTOUTF8
+fieldspec[32].arg1 "substring"
+fieldspec[32].maxlength 1048576
+fieldspec[32].fieldtype INDEX
+fieldspec[33].name "array1.f2"
+fieldspec[33].searchmethod INT32
+fieldspec[33].arg1 ""
+fieldspec[33].maxlength 1048576
+fieldspec[33].fieldtype INDEX
+fieldspec[34].name "array1.f3"
+fieldspec[34].searchmethod DOUBLE
+fieldspec[34].arg1 ""
+fieldspec[34].maxlength 1048576
+fieldspec[34].fieldtype INDEX
+fieldspec[35].name "array2.f1"
+fieldspec[35].searchmethod AUTOUTF8
+fieldspec[35].arg1 ""
+fieldspec[35].maxlength 1048576
+fieldspec[35].fieldtype INDEX
+fieldspec[36].name "array2.f1s"
+fieldspec[36].searchmethod AUTOUTF8
+fieldspec[36].arg1 "substring"
+fieldspec[36].maxlength 1048576
+fieldspec[36].fieldtype INDEX
+fieldspec[37].name "array2.f2"
+fieldspec[37].searchmethod INT32
+fieldspec[37].arg1 ""
+fieldspec[37].maxlength 1048576
+fieldspec[37].fieldtype INDEX
+fieldspec[38].name "array2.f3"
+fieldspec[38].searchmethod DOUBLE
+fieldspec[38].arg1 ""
+fieldspec[38].maxlength 1048576
+fieldspec[38].fieldtype INDEX
+fieldspec[39].name "array3.f1"
+fieldspec[39].searchmethod AUTOUTF8
+fieldspec[39].arg1 ""
+fieldspec[39].maxlength 1048576
+fieldspec[39].fieldtype ATTRIBUTE
+fieldspec[40].name "array3.f1s"
+fieldspec[40].searchmethod AUTOUTF8
+fieldspec[40].arg1 "prefix"
+fieldspec[40].maxlength 1048576
+fieldspec[40].fieldtype INDEX
+fieldspec[41].name "array3.f3"
+fieldspec[41].searchmethod DOUBLE
+fieldspec[41].arg1 ""
+fieldspec[41].maxlength 1048576
+fieldspec[41].fieldtype INDEX
+fieldspec[42].name "subject.f1"
+fieldspec[42].searchmethod AUTOUTF8
+fieldspec[42].arg1 ""
+fieldspec[42].maxlength 1048576
+fieldspec[42].fieldtype INDEX
+fieldspec[43].name "d.f1"
+fieldspec[43].searchmethod AUTOUTF8
+fieldspec[43].arg1 "prefix"
+fieldspec[43].maxlength 1048576
+fieldspec[43].fieldtype INDEX
+fieldspec[44].name "d.f1s"
+fieldspec[44].searchmethod AUTOUTF8
+fieldspec[44].arg1 "prefix"
+fieldspec[44].maxlength 1048576
+fieldspec[44].fieldtype INDEX
+fieldspec[45].name "d.f2"
+fieldspec[45].searchmethod INT32
+fieldspec[45].arg1 ""
+fieldspec[45].maxlength 1048576
+fieldspec[45].fieldtype INDEX
+fieldspec[46].name "d.f3"
+fieldspec[46].searchmethod DOUBLE
+fieldspec[46].arg1 ""
+fieldspec[46].maxlength 1048576
+fieldspec[46].fieldtype INDEX
+fieldspec[47].name "e.f1"
+fieldspec[47].searchmethod AUTOUTF8
+fieldspec[47].arg1 "substring"
+fieldspec[47].maxlength 1048576
+fieldspec[47].fieldtype INDEX
+fieldspec[48].name "e.f1s"
+fieldspec[48].searchmethod AUTOUTF8
+fieldspec[48].arg1 "substring"
+fieldspec[48].maxlength 1048576
+fieldspec[48].fieldtype INDEX
+fieldspec[49].name "e.f2"
+fieldspec[49].searchmethod INT32
+fieldspec[49].arg1 ""
+fieldspec[49].maxlength 1048576
+fieldspec[49].fieldtype INDEX
+fieldspec[50].name "e.f3"
+fieldspec[50].searchmethod DOUBLE
+fieldspec[50].arg1 ""
+fieldspec[50].maxlength 1048576
+fieldspec[50].fieldtype INDEX
+fieldspec[51].name "f.f1"
+fieldspec[51].searchmethod AUTOUTF8
+fieldspec[51].arg1 "suffix"
+fieldspec[51].maxlength 1048576
+fieldspec[51].fieldtype INDEX
+fieldspec[52].name "f.f1s"
+fieldspec[52].searchmethod AUTOUTF8
+fieldspec[52].arg1 "suffix"
+fieldspec[52].maxlength 1048576
+fieldspec[52].fieldtype INDEX
+fieldspec[53].name "f.f2"
+fieldspec[53].searchmethod INT32
+fieldspec[53].arg1 ""
+fieldspec[53].maxlength 1048576
+fieldspec[53].fieldtype INDEX
+fieldspec[54].name "f.f3"
+fieldspec[54].searchmethod DOUBLE
+fieldspec[54].arg1 ""
+fieldspec[54].maxlength 1048576
+fieldspec[54].fieldtype INDEX
+fieldspec[55].name "g"
+fieldspec[55].searchmethod AUTOUTF8
+fieldspec[55].arg1 ""
+fieldspec[55].maxlength 1048576
+fieldspec[55].fieldtype INDEX
+documenttype[0].name "streamingstruct"
+documenttype[0].index[0].name "coupleof"
+documenttype[0].index[0].field[0].name "coupleof"
+documenttype[0].index[1].name "normalfields"
+documenttype[0].index[1].field[0].name "normalfields"
+documenttype[0].index[2].name "b"
+documenttype[0].index[2].field[0].name "b.f1"
+documenttype[0].index[2].field[1].name "b.f1s"
+documenttype[0].index[2].field[2].name "b.f2"
+documenttype[0].index[2].field[3].name "b.f3"
+documenttype[0].index[3].name "b.f1"
+documenttype[0].index[3].field[0].name "b.f1"
+documenttype[0].index[4].name "b.f1s"
+documenttype[0].index[4].field[0].name "b.f1s"
+documenttype[0].index[5].name "b.f2"
+documenttype[0].index[5].field[0].name "b.f2"
+documenttype[0].index[6].name "b.f3"
+documenttype[0].index[6].field[0].name "b.f3"
+documenttype[0].index[7].name "c"
+documenttype[0].index[7].field[0].name "c.f1"
+documenttype[0].index[7].field[1].name "c.f1s"
+documenttype[0].index[7].field[2].name "c.f3"
+documenttype[0].index[8].name "c.f1"
+documenttype[0].index[8].field[0].name "c.f1"
+documenttype[0].index[9].name "c.f1s"
+documenttype[0].index[9].field[0].name "c.f1s"
+documenttype[0].index[10].name "c.f3"
+documenttype[0].index[10].field[0].name "c.f3"
+documenttype[0].index[11].name "c2"
+documenttype[0].index[11].field[0].name "c2.f1"
+documenttype[0].index[11].field[1].name "c2.f1s"
+documenttype[0].index[11].field[2].name "c2.f2"
+documenttype[0].index[11].field[3].name "c2.f3"
+documenttype[0].index[12].name "c2.f1"
+documenttype[0].index[12].field[0].name "c2.f1"
+documenttype[0].index[13].name "c2.f1s"
+documenttype[0].index[13].field[0].name "c2.f1s"
+documenttype[0].index[14].name "c2.f2"
+documenttype[0].index[14].field[0].name "c2.f2"
+documenttype[0].index[15].name "c2.f3"
+documenttype[0].index[15].field[0].name "c2.f3"
+documenttype[0].index[16].name "c3"
+documenttype[0].index[16].field[0].name "c3.f1"
+documenttype[0].index[16].field[1].name "c3.f1s"
+documenttype[0].index[16].field[2].name "c3.f2"
+documenttype[0].index[16].field[3].name "c3.f3"
+documenttype[0].index[17].name "c3.f1"
+documenttype[0].index[17].field[0].name "c3.f1"
+documenttype[0].index[18].name "c3.f1s"
+documenttype[0].index[18].field[0].name "c3.f1s"
+documenttype[0].index[19].name "c3.f2"
+documenttype[0].index[19].field[0].name "c3.f2"
+documenttype[0].index[20].name "c3.f3"
+documenttype[0].index[20].field[0].name "c3.f3"
+documenttype[0].index[21].name "n"
+documenttype[0].index[21].field[0].name "n.nf1.f1"
+documenttype[0].index[21].field[1].name "n.nf1.f1s"
+documenttype[0].index[21].field[2].name "n.nf1.f3"
+documenttype[0].index[21].field[3].name "n.nf1s.f1"
+documenttype[0].index[21].field[4].name "n.nf1s.f1s"
+documenttype[0].index[21].field[5].name "n.nf1s.f2"
+documenttype[0].index[21].field[6].name "n.nf1s.f3"
+documenttype[0].index[21].field[7].name "n.nf2"
+documenttype[0].index[22].name "n.nf1"
+documenttype[0].index[22].field[0].name "n.nf1.f1"
+documenttype[0].index[22].field[1].name "n.nf1.f1s"
+documenttype[0].index[22].field[2].name "n.nf1.f3"
+documenttype[0].index[23].name "n.nf1.f1"
+documenttype[0].index[23].field[0].name "n.nf1.f1"
+documenttype[0].index[24].name "n.nf1.f1s"
+documenttype[0].index[24].field[0].name "n.nf1.f1s"
+documenttype[0].index[25].name "n.nf1.f3"
+documenttype[0].index[25].field[0].name "n.nf1.f3"
+documenttype[0].index[26].name "n.nf1s"
+documenttype[0].index[26].field[0].name "n.nf1s.f1"
+documenttype[0].index[26].field[1].name "n.nf1s.f1s"
+documenttype[0].index[26].field[2].name "n.nf1s.f2"
+documenttype[0].index[26].field[3].name "n.nf1s.f3"
+documenttype[0].index[27].name "n.nf1s.f1"
+documenttype[0].index[27].field[0].name "n.nf1s.f1"
+documenttype[0].index[28].name "n.nf1s.f1s"
+documenttype[0].index[28].field[0].name "n.nf1s.f1s"
+documenttype[0].index[29].name "n.nf1s.f2"
+documenttype[0].index[29].field[0].name "n.nf1s.f2"
+documenttype[0].index[30].name "n.nf1s.f3"
+documenttype[0].index[30].field[0].name "n.nf1s.f3"
+documenttype[0].index[31].name "n.nf2"
+documenttype[0].index[31].field[0].name "n.nf2"
+documenttype[0].index[32].name "array2"
+documenttype[0].index[32].field[0].name "array2.f1"
+documenttype[0].index[32].field[1].name "array2.f1s"
+documenttype[0].index[32].field[2].name "array2.f2"
+documenttype[0].index[32].field[3].name "array2.f3"
+documenttype[0].index[33].name "array2.f1"
+documenttype[0].index[33].field[0].name "array2.f1"
+documenttype[0].index[34].name "array2.f1s"
+documenttype[0].index[34].field[0].name "array2.f1s"
+documenttype[0].index[35].name "array2.f2"
+documenttype[0].index[35].field[0].name "array2.f2"
+documenttype[0].index[36].name "array2.f3"
+documenttype[0].index[36].field[0].name "array2.f3"
+documenttype[0].index[37].name "array3"
+documenttype[0].index[37].field[0].name "array3.f1"
+documenttype[0].index[37].field[1].name "array3.f1s"
+documenttype[0].index[37].field[2].name "array3.f3"
+documenttype[0].index[38].name "array3.f1"
+documenttype[0].index[38].field[0].name "array3.f1"
+documenttype[0].index[39].name "array3.f1s"
+documenttype[0].index[39].field[0].name "array3.f1s"
+documenttype[0].index[40].name "array3.f3"
+documenttype[0].index[40].field[0].name "array3.f3"
+documenttype[0].index[41].name "d"
+documenttype[0].index[41].field[0].name "d.f1"
+documenttype[0].index[41].field[1].name "d.f1s"
+documenttype[0].index[41].field[2].name "d.f2"
+documenttype[0].index[41].field[3].name "d.f3"
+documenttype[0].index[42].name "d.f1"
+documenttype[0].index[42].field[0].name "d.f1"
+documenttype[0].index[43].name "d.f1s"
+documenttype[0].index[43].field[0].name "d.f1s"
+documenttype[0].index[44].name "d.f2"
+documenttype[0].index[44].field[0].name "d.f2"
+documenttype[0].index[45].name "d.f3"
+documenttype[0].index[45].field[0].name "d.f3"
+documenttype[0].index[46].name "e"
+documenttype[0].index[46].field[0].name "e.f1"
+documenttype[0].index[46].field[1].name "e.f1s"
+documenttype[0].index[46].field[2].name "e.f2"
+documenttype[0].index[46].field[3].name "e.f3"
+documenttype[0].index[47].name "e.f1"
+documenttype[0].index[47].field[0].name "e.f1"
+documenttype[0].index[48].name "e.f1s"
+documenttype[0].index[48].field[0].name "e.f1s"
+documenttype[0].index[49].name "e.f2"
+documenttype[0].index[49].field[0].name "e.f2"
+documenttype[0].index[50].name "e.f3"
+documenttype[0].index[50].field[0].name "e.f3"
+documenttype[0].index[51].name "f"
+documenttype[0].index[51].field[0].name "f.f1"
+documenttype[0].index[51].field[1].name "f.f1s"
+documenttype[0].index[51].field[2].name "f.f2"
+documenttype[0].index[51].field[3].name "f.f3"
+documenttype[0].index[52].name "f.f1"
+documenttype[0].index[52].field[0].name "f.f1"
+documenttype[0].index[53].name "f.f1s"
+documenttype[0].index[53].field[0].name "f.f1s"
+documenttype[0].index[54].name "f.f2"
+documenttype[0].index[54].field[0].name "f.f2"
+documenttype[0].index[55].name "f.f3"
+documenttype[0].index[55].field[0].name "f.f3"
+documenttype[0].index[56].name "g"
+documenttype[0].index[56].field[0].name "g" \ No newline at end of file
diff --git a/config-model/src/test/derived/streamingstruct/vsmsummary.cfg b/config-model/src/test/derived/streamingstruct/vsmsummary.cfg
new file mode 100644
index 00000000000..b7a75932f5c
--- /dev/null
+++ b/config-model/src/test/derived/streamingstruct/vsmsummary.cfg
@@ -0,0 +1,83 @@
+outputclass ""
+fieldmap[0].summary "coupleof"
+fieldmap[0].document[0].field "coupleof"
+fieldmap[0].command NONE
+fieldmap[1].summary "anothersummaryfield"
+fieldmap[1].document[0].field "normalfields"
+fieldmap[1].command NONE
+fieldmap[2].summary "a"
+fieldmap[2].document[0].field "a.f1"
+fieldmap[2].document[1].field "a.f1s"
+fieldmap[2].document[2].field "a.f2"
+fieldmap[2].document[3].field "a.f3"
+fieldmap[2].command NONE
+fieldmap[3].summary "m"
+fieldmap[3].document[0].field "m"
+fieldmap[3].command NONE
+fieldmap[4].summary "b"
+fieldmap[4].document[0].field "b.f1"
+fieldmap[4].document[1].field "b.f1s"
+fieldmap[4].document[2].field "b.f2"
+fieldmap[4].document[3].field "b.f3"
+fieldmap[4].command NONE
+fieldmap[5].summary "c"
+fieldmap[5].document[0].field "c.f1"
+fieldmap[5].document[1].field "c.f1s"
+fieldmap[5].document[2].field "c.f3"
+fieldmap[5].command NONE
+fieldmap[6].summary "c2"
+fieldmap[6].document[0].field "c2.f1"
+fieldmap[6].document[1].field "c2.f1s"
+fieldmap[6].document[2].field "c2.f2"
+fieldmap[6].document[3].field "c2.f3"
+fieldmap[6].command NONE
+fieldmap[7].summary "c3"
+fieldmap[7].document[0].field "c3.f1"
+fieldmap[7].document[1].field "c3.f2"
+fieldmap[7].document[2].field "c3.f3"
+fieldmap[7].command NONE
+fieldmap[8].summary "n"
+fieldmap[8].document[0].field "n.nf1.f1"
+fieldmap[8].document[1].field "n.nf1.f1s"
+fieldmap[8].document[2].field "n.nf1s.f1"
+fieldmap[8].document[3].field "n.nf1s.f1s"
+fieldmap[8].document[4].field "n.nf1s.f2"
+fieldmap[8].document[5].field "n.nf1s.f3"
+fieldmap[8].document[6].field "n.nf2"
+fieldmap[8].command NONE
+fieldmap[9].summary "array1"
+fieldmap[9].document[0].field "array1.f1"
+fieldmap[9].document[1].field "array1.f1s"
+fieldmap[9].document[2].field "array1.f2"
+fieldmap[9].document[3].field "array1.f3"
+fieldmap[9].command NONE
+fieldmap[10].summary "array2"
+fieldmap[10].document[0].field "array2.f1"
+fieldmap[10].document[1].field "array2.f1s"
+fieldmap[10].document[2].field "array2.f2"
+fieldmap[10].document[3].field "array2.f3"
+fieldmap[10].command NONE
+fieldmap[11].summary "array3"
+fieldmap[11].document[0].field "array3.f1"
+fieldmap[11].document[1].field "array3.f1s"
+fieldmap[11].document[2].field "array3.f3"
+fieldmap[11].command NONE
+fieldmap[12].summary "subject"
+fieldmap[12].document[0].field "subject.f1"
+fieldmap[12].command NONE
+fieldmap[13].summary "g"
+fieldmap[13].document[0].field "g"
+fieldmap[13].command FLATTENJUNIPER
+fieldmap[14].summary "rankfeatures"
+fieldmap[14].command NONE
+fieldmap[15].summary "summaryfeatures"
+fieldmap[15].command NONE
+fieldmap[16].summary "snippet"
+fieldmap[16].document[0].field "a.f1"
+fieldmap[16].document[1].field "b.f2"
+fieldmap[16].command FLATTENJUNIPER
+fieldmap[17].summary "snippet2"
+fieldmap[17].document[0].field "a.f1"
+fieldmap[17].document[1].field "b.f1"
+fieldmap[17].document[2].field "b.f2"
+fieldmap[17].command FLATTENSPACE \ No newline at end of file
diff --git a/config-model/src/test/derived/streamingstructdefault/streamingstructdefault.sd b/config-model/src/test/derived/streamingstructdefault/streamingstructdefault.sd
new file mode 100644
index 00000000000..5b2c3cc5598
--- /dev/null
+++ b/config-model/src/test/derived/streamingstructdefault/streamingstructdefault.sd
@@ -0,0 +1,24 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search streamingstructdefault {
+ document streamingstructdefault {
+ struct sct {
+ field s1 type string {}
+ field s2 type string {}
+ }
+ field f1 type array<string> {
+ indexing: index | summary
+ summary-to: default
+ header
+ }
+ field f2 type array<sct> {
+ indexing: index | summary
+ header
+ }
+ }
+ document-summary default {
+ summary sum1 type string {
+ source: f1, f2.s1
+ dynamic
+ }
+ }
+}
diff --git a/config-model/src/test/derived/streamingstructdefault/summary.cfg b/config-model/src/test/derived/streamingstructdefault/summary.cfg
new file mode 100644
index 00000000000..288de48b11d
--- /dev/null
+++ b/config-model/src/test/derived/streamingstructdefault/summary.cfg
@@ -0,0 +1,15 @@
+defaultsummaryid 718801936
+classes[0].id 718801936
+classes[0].name "default"
+classes[0].fields[0].name "sum1"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "f1"
+classes[0].fields[1].type "jsonstring"
+classes[0].fields[2].name "f2"
+classes[0].fields[2].type "jsonstring"
+classes[0].fields[3].name "rankfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "summaryfeatures"
+classes[0].fields[4].type "featuredata"
+classes[0].fields[5].name "documentid"
+classes[0].fields[5].type "longstring" \ No newline at end of file
diff --git a/config-model/src/test/derived/structanyorder/documentmanager.cfg b/config-model/src/test/derived/structanyorder/documentmanager.cfg
new file mode 100755
index 00000000000..dc56ed1cfc9
--- /dev/null
+++ b/config-model/src/test/derived/structanyorder/documentmanager.cfg
@@ -0,0 +1,83 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 109267174
+datatype[1].structtype[0].name "sct"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "s1"
+datatype[1].structtype[0].field[0].datatype 2
+datatype[1].structtype[0].field[1].name "s2"
+datatype[1].structtype[0].field[1].datatype 2
+datatype[1].structtype[0].field[2].name "s3"
+datatype[1].structtype[0].field[2].datatype 109267174
+datatype[1].structtype[0].field[3].name "s4"
+datatype[1].structtype[0].field[3].datatype 97614088
+datatype[2].id 97614088
+datatype[2].structtype[0].name "foo"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "s1"
+datatype[2].structtype[0].field[0].datatype 0
+datatype[3].id 517946310
+datatype[3].structtype[0].name "annotation.banana"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "b"
+datatype[3].structtype[0].field[0].datatype 109267174
+datatype[3].structtype[0].field[1].name "c"
+datatype[3].structtype[0].field[1].datatype 97614088
+datatype[4].id -1244829667
+datatype[4].arraytype[0].datatype 109267174
+datatype[5].id -364910881
+datatype[5].structtype[0].name "annotationsimplicitstruct.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "structfield"
+datatype[5].structtype[0].field[0].datatype 109267174
+datatype[5].structtype[0].field[1].name "structarrayfield"
+datatype[5].structtype[0].field[1].datatype -1244829667
+datatype[5].structtype[0].field[2].name "rankfeatures"
+datatype[5].structtype[0].field[2].datatype 2
+datatype[5].structtype[0].field[3].name "summaryfeatures"
+datatype[5].structtype[0].field[3].datatype 2
+datatype[6].id -1503592268
+datatype[6].structtype[0].name "annotationsimplicitstruct.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id -2099544992
+datatype[7].documenttype[0].name "annotationsimplicitstruct"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].headerstruct -364910881
+datatype[7].documenttype[0].bodystruct -1503592268
+datatype[7].documenttype[0].fieldsets{[document]}.fields[0] "structarrayfield"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[1] "structfield"
+annotationtype[0].id -269517759
+annotationtype[0].name "banana"
+annotationtype[0].datatype 517946310
diff --git a/config-model/src/test/derived/structanyorder/ilscripts.cfg b/config-model/src/test/derived/structanyorder/ilscripts.cfg
new file mode 100644
index 00000000000..b86571ce666
--- /dev/null
+++ b/config-model/src/test/derived/structanyorder/ilscripts.cfg
@@ -0,0 +1,6 @@
+maxtermoccurrences 100
+ilscript[0].doctype "annotationsimplicitstruct"
+ilscript[0].docfield[0] "structfield"
+ilscript[0].docfield[1] "structarrayfield"
+ilscript[0].content[0] "input structarrayfield | passthrough structarrayfield"
+ilscript[0].content[1] "input structfield | passthrough structfield" \ No newline at end of file
diff --git a/config-model/src/test/derived/structanyorder/index-info.cfg b/config-model/src/test/derived/structanyorder/index-info.cfg
new file mode 100755
index 00000000000..d62288df458
--- /dev/null
+++ b/config-model/src/test/derived/structanyorder/index-info.cfg
@@ -0,0 +1,247 @@
+indexinfo[0].name "annotationsimplicitstruct"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "structfield.s1"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "structfield.s2"
+indexinfo[0].command[3].command "index"
+indexinfo[0].command[4].indexname "structfield.s3.s1"
+indexinfo[0].command[4].command "index"
+indexinfo[0].command[5].indexname "structfield.s3.s2"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "structfield.s3.s3.s1"
+indexinfo[0].command[6].command "index"
+indexinfo[0].command[7].indexname "structfield.s3.s3.s2"
+indexinfo[0].command[7].command "index"
+indexinfo[0].command[8].indexname "structfield.s3.s3.s3.s1"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "structfield.s3.s3.s3.s2"
+indexinfo[0].command[9].command "index"
+indexinfo[0].command[10].indexname "structfield.s3.s3.s3.s3.s1"
+indexinfo[0].command[10].command "index"
+indexinfo[0].command[11].indexname "structfield.s3.s3.s3.s3.s2"
+indexinfo[0].command[11].command "index"
+indexinfo[0].command[12].indexname "structfield.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[12].command "index"
+indexinfo[0].command[13].indexname "structfield.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[13].command "index"
+indexinfo[0].command[14].indexname "structfield.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "structfield.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[15].command "index"
+indexinfo[0].command[16].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[16].command "index"
+indexinfo[0].command[17].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[17].command "index"
+indexinfo[0].command[18].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[18].command "index"
+indexinfo[0].command[19].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[19].command "index"
+indexinfo[0].command[20].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[20].command "index"
+indexinfo[0].command[21].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[22].command "index"
+indexinfo[0].command[23].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[23].command "index"
+indexinfo[0].command[24].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[25].command "index"
+indexinfo[0].command[26].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[26].command "numerical"
+indexinfo[0].command[27].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[27].command "index"
+indexinfo[0].command[28].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[30].command "numerical"
+indexinfo[0].command[31].indexname "structfield.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[31].command "index"
+indexinfo[0].command[32].indexname "structfield.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[32].command "index"
+indexinfo[0].command[33].indexname "structfield.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[33].command "index"
+indexinfo[0].command[34].indexname "structfield.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[34].command "numerical"
+indexinfo[0].command[35].indexname "structfield.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[35].command "index"
+indexinfo[0].command[36].indexname "structfield.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[36].command "index"
+indexinfo[0].command[37].indexname "structfield.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[37].command "index"
+indexinfo[0].command[38].indexname "structfield.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[38].command "numerical"
+indexinfo[0].command[39].indexname "structfield.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[39].command "index"
+indexinfo[0].command[40].indexname "structfield.s3.s3.s3.s3.s3"
+indexinfo[0].command[40].command "index"
+indexinfo[0].command[41].indexname "structfield.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[41].command "index"
+indexinfo[0].command[42].indexname "structfield.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[42].command "numerical"
+indexinfo[0].command[43].indexname "structfield.s3.s3.s3.s3.s4"
+indexinfo[0].command[43].command "index"
+indexinfo[0].command[44].indexname "structfield.s3.s3.s3.s3"
+indexinfo[0].command[44].command "index"
+indexinfo[0].command[45].indexname "structfield.s3.s3.s3.s4.s1"
+indexinfo[0].command[45].command "index"
+indexinfo[0].command[46].indexname "structfield.s3.s3.s3.s4.s1"
+indexinfo[0].command[46].command "numerical"
+indexinfo[0].command[47].indexname "structfield.s3.s3.s3.s4"
+indexinfo[0].command[47].command "index"
+indexinfo[0].command[48].indexname "structfield.s3.s3.s3"
+indexinfo[0].command[48].command "index"
+indexinfo[0].command[49].indexname "structfield.s3.s3.s4.s1"
+indexinfo[0].command[49].command "index"
+indexinfo[0].command[50].indexname "structfield.s3.s3.s4.s1"
+indexinfo[0].command[50].command "numerical"
+indexinfo[0].command[51].indexname "structfield.s3.s3.s4"
+indexinfo[0].command[51].command "index"
+indexinfo[0].command[52].indexname "structfield.s3.s3"
+indexinfo[0].command[52].command "index"
+indexinfo[0].command[53].indexname "structfield.s3.s4.s1"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "structfield.s3.s4.s1"
+indexinfo[0].command[54].command "numerical"
+indexinfo[0].command[55].indexname "structfield.s3.s4"
+indexinfo[0].command[55].command "index"
+indexinfo[0].command[56].indexname "structfield.s3"
+indexinfo[0].command[56].command "index"
+indexinfo[0].command[57].indexname "structfield.s4.s1"
+indexinfo[0].command[57].command "index"
+indexinfo[0].command[58].indexname "structfield.s4.s1"
+indexinfo[0].command[58].command "numerical"
+indexinfo[0].command[59].indexname "structfield.s4"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "structfield"
+indexinfo[0].command[60].command "index"
+indexinfo[0].command[61].indexname "structarrayfield.s1"
+indexinfo[0].command[61].command "index"
+indexinfo[0].command[62].indexname "structarrayfield.s2"
+indexinfo[0].command[62].command "index"
+indexinfo[0].command[63].indexname "structarrayfield.s3.s1"
+indexinfo[0].command[63].command "index"
+indexinfo[0].command[64].indexname "structarrayfield.s3.s2"
+indexinfo[0].command[64].command "index"
+indexinfo[0].command[65].indexname "structarrayfield.s3.s3.s1"
+indexinfo[0].command[65].command "index"
+indexinfo[0].command[66].indexname "structarrayfield.s3.s3.s2"
+indexinfo[0].command[66].command "index"
+indexinfo[0].command[67].indexname "structarrayfield.s3.s3.s3.s1"
+indexinfo[0].command[67].command "index"
+indexinfo[0].command[68].indexname "structarrayfield.s3.s3.s3.s2"
+indexinfo[0].command[68].command "index"
+indexinfo[0].command[69].indexname "structarrayfield.s3.s3.s3.s3.s1"
+indexinfo[0].command[69].command "index"
+indexinfo[0].command[70].indexname "structarrayfield.s3.s3.s3.s3.s2"
+indexinfo[0].command[70].command "index"
+indexinfo[0].command[71].indexname "structarrayfield.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[71].command "index"
+indexinfo[0].command[72].indexname "structarrayfield.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[72].command "index"
+indexinfo[0].command[73].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[73].command "index"
+indexinfo[0].command[74].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[74].command "index"
+indexinfo[0].command[75].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[75].command "index"
+indexinfo[0].command[76].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[76].command "index"
+indexinfo[0].command[77].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[77].command "index"
+indexinfo[0].command[78].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[78].command "index"
+indexinfo[0].command[79].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s1"
+indexinfo[0].command[79].command "index"
+indexinfo[0].command[80].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s2"
+indexinfo[0].command[80].command "index"
+indexinfo[0].command[81].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[81].command "index"
+indexinfo[0].command[82].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[82].command "index"
+indexinfo[0].command[83].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[83].command "index"
+indexinfo[0].command[84].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[84].command "index"
+indexinfo[0].command[85].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[85].command "numerical"
+indexinfo[0].command[86].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[86].command "index"
+indexinfo[0].command[87].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[87].command "index"
+indexinfo[0].command[88].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[88].command "index"
+indexinfo[0].command[89].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[89].command "numerical"
+indexinfo[0].command[90].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[90].command "index"
+indexinfo[0].command[91].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[91].command "index"
+indexinfo[0].command[92].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[92].command "index"
+indexinfo[0].command[93].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[93].command "numerical"
+indexinfo[0].command[94].indexname "structarrayfield.s3.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[94].command "index"
+indexinfo[0].command[95].indexname "structarrayfield.s3.s3.s3.s3.s3.s3"
+indexinfo[0].command[95].command "index"
+indexinfo[0].command[96].indexname "structarrayfield.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[96].command "index"
+indexinfo[0].command[97].indexname "structarrayfield.s3.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[97].command "numerical"
+indexinfo[0].command[98].indexname "structarrayfield.s3.s3.s3.s3.s3.s4"
+indexinfo[0].command[98].command "index"
+indexinfo[0].command[99].indexname "structarrayfield.s3.s3.s3.s3.s3"
+indexinfo[0].command[99].command "index"
+indexinfo[0].command[100].indexname "structarrayfield.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[100].command "index"
+indexinfo[0].command[101].indexname "structarrayfield.s3.s3.s3.s3.s4.s1"
+indexinfo[0].command[101].command "numerical"
+indexinfo[0].command[102].indexname "structarrayfield.s3.s3.s3.s3.s4"
+indexinfo[0].command[102].command "index"
+indexinfo[0].command[103].indexname "structarrayfield.s3.s3.s3.s3"
+indexinfo[0].command[103].command "index"
+indexinfo[0].command[104].indexname "structarrayfield.s3.s3.s3.s4.s1"
+indexinfo[0].command[104].command "index"
+indexinfo[0].command[105].indexname "structarrayfield.s3.s3.s3.s4.s1"
+indexinfo[0].command[105].command "numerical"
+indexinfo[0].command[106].indexname "structarrayfield.s3.s3.s3.s4"
+indexinfo[0].command[106].command "index"
+indexinfo[0].command[107].indexname "structarrayfield.s3.s3.s3"
+indexinfo[0].command[107].command "index"
+indexinfo[0].command[108].indexname "structarrayfield.s3.s3.s4.s1"
+indexinfo[0].command[108].command "index"
+indexinfo[0].command[109].indexname "structarrayfield.s3.s3.s4.s1"
+indexinfo[0].command[109].command "numerical"
+indexinfo[0].command[110].indexname "structarrayfield.s3.s3.s4"
+indexinfo[0].command[110].command "index"
+indexinfo[0].command[111].indexname "structarrayfield.s3.s3"
+indexinfo[0].command[111].command "index"
+indexinfo[0].command[112].indexname "structarrayfield.s3.s4.s1"
+indexinfo[0].command[112].command "index"
+indexinfo[0].command[113].indexname "structarrayfield.s3.s4.s1"
+indexinfo[0].command[113].command "numerical"
+indexinfo[0].command[114].indexname "structarrayfield.s3.s4"
+indexinfo[0].command[114].command "index"
+indexinfo[0].command[115].indexname "structarrayfield.s3"
+indexinfo[0].command[115].command "index"
+indexinfo[0].command[116].indexname "structarrayfield.s4.s1"
+indexinfo[0].command[116].command "index"
+indexinfo[0].command[117].indexname "structarrayfield.s4.s1"
+indexinfo[0].command[117].command "numerical"
+indexinfo[0].command[118].indexname "structarrayfield.s4"
+indexinfo[0].command[118].command "index"
+indexinfo[0].command[119].indexname "structarrayfield"
+indexinfo[0].command[119].command "index"
+indexinfo[0].command[120].indexname "structarrayfield"
+indexinfo[0].command[120].command "multivalue"
+indexinfo[0].command[121].indexname "rankfeatures"
+indexinfo[0].command[121].command "index"
+indexinfo[0].command[122].indexname "summaryfeatures"
+indexinfo[0].command[122].command "index" \ No newline at end of file
diff --git a/config-model/src/test/derived/structanyorder/structanyorder.sd b/config-model/src/test/derived/structanyorder/structanyorder.sd
new file mode 100755
index 00000000000..418c0985062
--- /dev/null
+++ b/config-model/src/test/derived/structanyorder/structanyorder.sd
@@ -0,0 +1,27 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search annotationsimplicitstruct {
+
+ document annotationsimplicitstruct {
+ field structfield type sct {
+ }
+
+ field structarrayfield type array<sct> {
+ }
+
+ annotation banana {
+ field b type sct { }
+ field c type foo { }
+ }
+
+ struct sct {
+ field s1 type string {}
+ field s2 type string {}
+ field s3 type sct {}
+ field s4 type foo {}
+ }
+
+ struct foo {
+ field s1 type int {}
+ }
+ }
+}
diff --git a/config-model/src/test/derived/tensor/attributes.cfg b/config-model/src/test/derived/tensor/attributes.cfg
new file mode 100644
index 00000000000..a3026d579d5
--- /dev/null
+++ b/config-model/src/test/derived/tensor/attributes.cfg
@@ -0,0 +1,57 @@
+attribute[0].name "f2"
+attribute[0].datatype TENSOR
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "f3"
+attribute[1].datatype TENSOR
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "f4"
+attribute[2].datatype TENSOR
+attribute[2].collectiontype SINGLE
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype "tensor(x[10],y[20])" \ No newline at end of file
diff --git a/config-model/src/test/derived/tensor/documenttypes.cfg b/config-model/src/test/derived/tensor/documenttypes.cfg
new file mode 100644
index 00000000000..2a76458a97a
--- /dev/null
+++ b/config-model/src/test/derived/tensor/documenttypes.cfg
@@ -0,0 +1,65 @@
+enablecompression false
+documenttype[0].id -1290043429
+documenttype[0].name "tensor"
+documenttype[0].version 0
+documenttype[0].headerstruct 2125927172
+documenttype[0].bodystruct -1903234535
+documenttype[0].inherits[0].id 8
+documenttype[0].datatype[0].id 2125927172
+documenttype[0].datatype[0].type STRUCT
+documenttype[0].datatype[0].array.element.id 0
+documenttype[0].datatype[0].map.key.id 0
+documenttype[0].datatype[0].map.value.id 0
+documenttype[0].datatype[0].wset.key.id 0
+documenttype[0].datatype[0].wset.createifnonexistent false
+documenttype[0].datatype[0].wset.removeifzero false
+documenttype[0].datatype[0].annotationref.annotation.id 0
+documenttype[0].datatype[0].sstruct.name "tensor.header"
+documenttype[0].datatype[0].sstruct.version 0
+documenttype[0].datatype[0].sstruct.compression.type NONE
+documenttype[0].datatype[0].sstruct.compression.level 0
+documenttype[0].datatype[0].sstruct.compression.threshold 95
+documenttype[0].datatype[0].sstruct.compression.minsize 200
+documenttype[0].datatype[0].sstruct.field[0].name "f1"
+documenttype[0].datatype[0].sstruct.field[0].id 26661415
+documenttype[0].datatype[0].sstruct.field[0].id_v6 1740179945
+documenttype[0].datatype[0].sstruct.field[0].datatype 21
+documenttype[0].datatype[0].sstruct.field[1].name "f2"
+documenttype[0].datatype[0].sstruct.field[1].id 2080644671
+documenttype[0].datatype[0].sstruct.field[1].id_v6 1424572148
+documenttype[0].datatype[0].sstruct.field[1].datatype 21
+documenttype[0].datatype[0].sstruct.field[2].name "f3"
+documenttype[0].datatype[0].sstruct.field[2].id 1295091863
+documenttype[0].datatype[0].sstruct.field[2].id_v6 1444109654
+documenttype[0].datatype[0].sstruct.field[2].datatype 21
+documenttype[0].datatype[0].sstruct.field[3].name "f4"
+documenttype[0].datatype[0].sstruct.field[3].id 1224191509
+documenttype[0].datatype[0].sstruct.field[3].id_v6 1039544782
+documenttype[0].datatype[0].sstruct.field[3].datatype 21
+documenttype[0].datatype[0].sstruct.field[4].name "rankfeatures"
+documenttype[0].datatype[0].sstruct.field[4].id 1883197392
+documenttype[0].datatype[0].sstruct.field[4].id_v6 699950698
+documenttype[0].datatype[0].sstruct.field[4].datatype 2
+documenttype[0].datatype[0].sstruct.field[5].name "summaryfeatures"
+documenttype[0].datatype[0].sstruct.field[5].id 1840337115
+documenttype[0].datatype[0].sstruct.field[5].id_v6 1981648971
+documenttype[0].datatype[0].sstruct.field[5].datatype 2
+documenttype[0].datatype[1].id -1903234535
+documenttype[0].datatype[1].type STRUCT
+documenttype[0].datatype[1].array.element.id 0
+documenttype[0].datatype[1].map.key.id 0
+documenttype[0].datatype[1].map.value.id 0
+documenttype[0].datatype[1].wset.key.id 0
+documenttype[0].datatype[1].wset.createifnonexistent false
+documenttype[0].datatype[1].wset.removeifzero false
+documenttype[0].datatype[1].annotationref.annotation.id 0
+documenttype[0].datatype[1].sstruct.name "tensor.body"
+documenttype[0].datatype[1].sstruct.version 0
+documenttype[0].datatype[1].sstruct.compression.type NONE
+documenttype[0].datatype[1].sstruct.compression.level 0
+documenttype[0].datatype[1].sstruct.compression.threshold 95
+documenttype[0].datatype[1].sstruct.compression.minsize 200
+documenttype[0].fieldsets{[document]}.fields[0] "f1"
+documenttype[0].fieldsets{[document]}.fields[1] "f2"
+documenttype[0].fieldsets{[document]}.fields[2] "f3"
+documenttype[0].fieldsets{[document]}.fields[3] "f4"
diff --git a/config-model/src/test/derived/tensor/summary.cfg b/config-model/src/test/derived/tensor/summary.cfg
new file mode 100644
index 00000000000..b6d00bc4799
--- /dev/null
+++ b/config-model/src/test/derived/tensor/summary.cfg
@@ -0,0 +1,25 @@
+defaultsummaryid 657634105
+classes[0].id 657634105
+classes[0].name "default"
+classes[0].fields[0].name "f1"
+classes[0].fields[0].type "jsonstring"
+classes[0].fields[1].name "f3"
+classes[0].fields[1].type "jsonstring"
+classes[0].fields[2].name "rankfeatures"
+classes[0].fields[2].type "featuredata"
+classes[0].fields[3].name "summaryfeatures"
+classes[0].fields[3].type "featuredata"
+classes[0].fields[4].name "documentid"
+classes[0].fields[4].type "longstring"
+classes[1].id 457955124
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "f2"
+classes[1].fields[0].type "jsonstring"
+classes[1].fields[1].name "f3"
+classes[1].fields[1].type "jsonstring"
+classes[1].fields[2].name "f4"
+classes[1].fields[2].type "jsonstring"
+classes[1].fields[3].name "rankfeatures"
+classes[1].fields[3].type "featuredata"
+classes[1].fields[4].name "summaryfeatures"
+classes[1].fields[4].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/tensor/tensor.sd b/config-model/src/test/derived/tensor/tensor.sd
new file mode 100644
index 00000000000..b89b96e253b
--- /dev/null
+++ b/config-model/src/test/derived/tensor/tensor.sd
@@ -0,0 +1,18 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search tensor {
+ document tensor {
+ field f1 type tensor {
+ indexing: summary
+ }
+ field f2 type tensor {
+ indexing: attribute
+ }
+ field f3 type tensor {
+ indexing: attribute | summary
+ }
+ field f4 type tensor {
+ indexing: attribute
+ attribute: tensor(x[10],y[20])
+ }
+ }
+}
diff --git a/config-model/src/test/derived/twostreamingstructs/documentmanager.cfg b/config-model/src/test/derived/twostreamingstructs/documentmanager.cfg
new file mode 100644
index 00000000000..6dee91664be
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/documentmanager.cfg
@@ -0,0 +1,166 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id 105061838
+datatype[1].structtype[0].name "ns1"
+datatype[1].structtype[0].version 0
+datatype[1].structtype[0].compresstype NONE
+datatype[1].structtype[0].compresslevel 0
+datatype[1].structtype[0].compressthreshold 95
+datatype[1].structtype[0].compressminsize 800
+datatype[1].structtype[0].field[0].name "nf1"
+datatype[1].structtype[0].field[0].datatype 3474528
+datatype[1].structtype[0].field[1].name "nf1s"
+datatype[1].structtype[0].field[1].datatype 3474528
+datatype[1].structtype[0].field[2].name "nf2"
+datatype[1].structtype[0].field[2].datatype 2
+datatype[2].id 3474528
+datatype[2].structtype[0].name "s1"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "f1"
+datatype[2].structtype[0].field[0].datatype 2
+datatype[2].structtype[0].field[1].name "f1s"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[2].name "f2"
+datatype[2].structtype[0].field[2].datatype 0
+datatype[2].structtype[0].field[3].name "f3"
+datatype[2].structtype[0].field[3].datatype 5
+datatype[3].id -1497802371
+datatype[3].maptype[0].keytype 4
+datatype[3].maptype[0].valtype 2
+datatype[4].id -1425630723
+datatype[4].arraytype[0].datatype 3474528
+datatype[5].id 731395686
+datatype[5].structtype[0].name "streamingstruct.header"
+datatype[5].structtype[0].version 0
+datatype[5].structtype[0].compresstype NONE
+datatype[5].structtype[0].compresslevel 0
+datatype[5].structtype[0].compressthreshold 95
+datatype[5].structtype[0].compressminsize 800
+datatype[5].structtype[0].field[0].name "coupleof"
+datatype[5].structtype[0].field[0].datatype 2
+datatype[5].structtype[0].field[1].name "normalfields"
+datatype[5].structtype[0].field[1].datatype 2
+datatype[5].structtype[0].field[2].name "a"
+datatype[5].structtype[0].field[2].datatype 3474528
+datatype[5].structtype[0].field[3].name "m"
+datatype[5].structtype[0].field[3].datatype -1497802371
+datatype[5].structtype[0].field[4].name "b"
+datatype[5].structtype[0].field[4].datatype 3474528
+datatype[5].structtype[0].field[5].name "c"
+datatype[5].structtype[0].field[5].datatype 3474528
+datatype[5].structtype[0].field[6].name "c2"
+datatype[5].structtype[0].field[6].datatype 3474528
+datatype[5].structtype[0].field[7].name "c3"
+datatype[5].structtype[0].field[7].datatype 3474528
+datatype[5].structtype[0].field[8].name "n"
+datatype[5].structtype[0].field[8].datatype 105061838
+datatype[5].structtype[0].field[9].name "array1"
+datatype[5].structtype[0].field[9].datatype -1425630723
+datatype[5].structtype[0].field[10].name "array2"
+datatype[5].structtype[0].field[10].datatype -1425630723
+datatype[5].structtype[0].field[11].name "array3"
+datatype[5].structtype[0].field[11].datatype -1425630723
+datatype[5].structtype[0].field[12].name "subject"
+datatype[5].structtype[0].field[12].datatype 3474528
+datatype[5].structtype[0].field[13].name "d"
+datatype[5].structtype[0].field[13].datatype 3474528
+datatype[5].structtype[0].field[14].name "e"
+datatype[5].structtype[0].field[14].datatype 3474528
+datatype[5].structtype[0].field[15].name "f"
+datatype[5].structtype[0].field[15].datatype 3474528
+datatype[5].structtype[0].field[16].name "g"
+datatype[5].structtype[0].field[16].datatype 2
+datatype[5].structtype[0].field[17].name "anothersummaryfield"
+datatype[5].structtype[0].field[17].datatype 2
+datatype[5].structtype[0].field[18].name "rankfeatures"
+datatype[5].structtype[0].field[18].datatype 2
+datatype[5].structtype[0].field[19].name "summaryfeatures"
+datatype[5].structtype[0].field[19].datatype 2
+datatype[5].structtype[0].field[20].name "snippet"
+datatype[5].structtype[0].field[20].datatype 2
+datatype[5].structtype[0].field[21].name "snippet2"
+datatype[5].structtype[0].field[21].datatype 2
+datatype[6].id 1858438651
+datatype[6].structtype[0].name "streamingstruct.body"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[7].id 1433175737
+datatype[7].documenttype[0].name "streamingstruct"
+datatype[7].documenttype[0].version 0
+datatype[7].documenttype[0].inherits[0].name "document"
+datatype[7].documenttype[0].inherits[0].version 0
+datatype[7].documenttype[0].headerstruct 731395686
+datatype[7].documenttype[0].bodystruct 1858438651
+datatype[7].documenttype[0].fieldsets{[document]}.fields[0] "a"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[1] "array1"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[2] "array2"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[3] "array3"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[4] "b"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[5] "c"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[6] "c2"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[7] "c3"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[8] "coupleof"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[9] "d"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[10] "e"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[11] "f"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[12] "g"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[13] "m"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[14] "n"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[15] "normalfields"
+datatype[7].documenttype[0].fieldsets{[document]}.fields[16] "subject"
+datatype[8].id -995681764
+datatype[8].structtype[0].name "pair"
+datatype[8].structtype[0].version 0
+datatype[8].structtype[0].compresstype NONE
+datatype[8].structtype[0].compresslevel 0
+datatype[8].structtype[0].compressthreshold 95
+datatype[8].structtype[0].compressminsize 800
+datatype[8].structtype[0].field[0].name "key"
+datatype[8].structtype[0].field[0].datatype 2
+datatype[8].structtype[0].field[1].name "value"
+datatype[8].structtype[0].field[1].datatype 2
+datatype[9].id 355471259
+datatype[9].structtype[0].name "whatever.header"
+datatype[9].structtype[0].version 0
+datatype[9].structtype[0].compresstype NONE
+datatype[9].structtype[0].compresslevel 0
+datatype[9].structtype[0].compressthreshold 95
+datatype[9].structtype[0].compressminsize 800
+datatype[9].structtype[0].field[0].name "rankfeatures"
+datatype[9].structtype[0].field[0].datatype 2
+datatype[9].structtype[0].field[1].name "summaryfeatures"
+datatype[9].structtype[0].field[1].datatype 2
+datatype[10].id -1417926544
+datatype[10].structtype[0].name "whatever.body"
+datatype[10].structtype[0].version 0
+datatype[10].structtype[0].compresstype NONE
+datatype[10].structtype[0].compresslevel 0
+datatype[10].structtype[0].compressthreshold 95
+datatype[10].structtype[0].compressminsize 800
+datatype[10].structtype[0].field[0].name "f1"
+datatype[10].structtype[0].field[0].datatype -995681764
+datatype[11].id -778211548
+datatype[11].documenttype[0].name "whatever"
+datatype[11].documenttype[0].version 0
+datatype[11].documenttype[0].inherits[0].name "document"
+datatype[11].documenttype[0].inherits[0].version 0
+datatype[11].documenttype[0].headerstruct 355471259
+datatype[11].documenttype[0].bodystruct -1417926544
+datatype[11].documenttype[0].fieldsets{[document]}.fields[0] "f1"
diff --git a/config-model/src/test/derived/twostreamingstructs/streamingstruct.sd b/config-model/src/test/derived/twostreamingstructs/streamingstruct.sd
new file mode 100644
index 00000000000..dabe9837af8
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/streamingstruct.sd
@@ -0,0 +1,183 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search streamingstruct {
+
+ document streamingstruct {
+ field coupleof type string {
+ indexing: index | summary
+ }
+
+ field normalfields type string {
+ indexing: index | summary
+ summary anothersummaryfield {
+ source: normalfields
+ }
+ }
+
+ struct s1 {
+ field f1 type string { }
+ field f1s type string { match: substring }
+ field f2 type int { }
+ field f3 type double { }
+ # Allow default matchtypes in struct. Can be overridden.
+ # No index/attribute related stuff. It is only a datatype definition.
+ }
+ struct ns1 {
+ field nf1 type s1 { }
+ field nf1s type s1 { match: substring }
+ field nf2 type string { }
+ # May specify nested structs.
+ }
+
+ field a type s1 {
+ indexing: summary
+ # Will generate attribute a.f1, a.f1s, a.f2, a.f3
+ # with datatypes preserved.
+ # No customisation.
+ # a will be a synonym for all (a.*)
+ }
+ field m type map<long, string> {
+ indexing: summary
+ # Will generate attribute m.key, m.value
+ # with datatypes preserved.
+ # m will be a synonym for all (m.*)
+ }
+ field b type s1 {
+ indexing: index | summary
+ # Will generate index b.f1, b.f1s, b.f2, b.f3
+ # with datatypes preserved if backend allows.
+ # No customisation.
+ # b will be synonym for all (b.*).
+ }
+ field c type s1 {
+ struct-field f1 {
+ # Whatever you normally write in a field declaration
+ indexing: attribute | summary # -> Generates attribute c.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> c.f1s
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index | summary # -> c.f3
+ }
+ # attribute c will be synonym for c.f1.
+ # Index c will be synonym for c.f1s OR c.f3.
+ # Indexed search can handle that however they want.
+ }
+ field c2 type s1 {
+ struct-field f1 {
+ # Whatever you normally write in a field declaration
+ indexing: attribute | summary # -> Generates attribute c2.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> c2.f1s
+ match: suffix
+ }
+ struct-field f2 {
+ indexing: index | summary # -> c2.f2
+ }
+ struct-field f3 {
+ indexing: index | summary # -> c2.f3
+ }
+ }
+ field c3 type s1 {
+ # Uses all sub fields, but not summary for all.
+ struct-field f1 {
+ indexing: attribute | summary
+ }
+ struct-field f1s {
+ indexing: index
+ match: prefix
+ }
+ struct-field f2 {
+ indexing: index | summary
+ }
+ struct-field f3 {
+ indexing: index | summary
+ }
+ }
+ field n type ns1 {
+ struct-field nf1 {
+ struct-field f1 {
+ indexing: index | summary
+ }
+ struct-field f1s {
+ indexing: index | summary
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index
+ }
+ }
+ struct-field nf1s {
+ indexing: index | summary
+ }
+ struct-field nf2 {
+ indexing: index | summary
+ }
+ # Will generate indexes n.nf1.f1, n.nf1.f1s, n.nf1.f3,
+ # n.nf1s.f1, n.nf1s.f1s, n.nf1s.f2, n.nf1s.f3
+ # and n.nf2.
+ # n will be synonym for all 8,
+ # n.nf1 will be synonym for the first 3 and
+ # n.nf1s will be synonym for the next 4
+ }
+
+ field array1 type array<s1> {
+ indexing: summary
+ }
+ field array2 type array<s1> {
+ indexing: index | summary
+ }
+ field array3 type array<s1> {
+ struct-field f1 {
+ indexing: attribute | summary # -> Generates attribute array3.f1
+ }
+ struct-field f1s {
+ indexing: index | summary # -> array3.f1s
+ match: prefix
+ }
+ struct-field f3 {
+ indexing: index | summary # -> array3.f3
+ }
+ }
+ field subject type s1 {
+ struct-field f1 {
+ indexing: summary
+ summary subject {
+ source:subject.f1
+ }
+ }
+ }
+ field d type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: prefix
+ }
+ field e type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: substring
+ }
+ field f type s1 {
+ indexing: index
+ # override matching for all subfields
+ match: suffix
+ }
+ field g type string {
+ indexing: index | summary
+ summary: dynamic
+ }
+ }
+
+ document-summary summ {
+ summary snippet type string {
+ dynamic
+ source: a.f1, b.f2
+ }
+ summary snippet2 type string {
+ source: a.f1, b.f1, b.f2
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/twostreamingstructs/summary.cfg b/config-model/src/test/derived/twostreamingstructs/summary.cfg
new file mode 100644
index 00000000000..9d722116850
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/summary.cfg
@@ -0,0 +1,51 @@
+defaultsummaryid 569269436
+classes[0].id 569269436
+classes[0].name "default"
+classes[0].fields[0].name "coupleof"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "anothersummaryfield"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "a"
+classes[0].fields[2].type "jsonstring"
+classes[0].fields[3].name "m"
+classes[0].fields[3].type "jsonstring"
+classes[0].fields[4].name "b"
+classes[0].fields[4].type "jsonstring"
+classes[0].fields[5].name "c"
+classes[0].fields[5].type "jsonstring"
+classes[0].fields[6].name "c2"
+classes[0].fields[6].type "jsonstring"
+classes[0].fields[7].name "c3"
+classes[0].fields[7].type "jsonstring"
+classes[0].fields[8].name "n"
+classes[0].fields[8].type "jsonstring"
+classes[0].fields[9].name "array1"
+classes[0].fields[9].type "jsonstring"
+classes[0].fields[10].name "array2"
+classes[0].fields[10].type "jsonstring"
+classes[0].fields[11].name "array3"
+classes[0].fields[11].type "jsonstring"
+classes[0].fields[12].name "subject"
+classes[0].fields[12].type "jsonstring"
+classes[0].fields[13].name "g"
+classes[0].fields[13].type "longstring"
+classes[0].fields[14].name "rankfeatures"
+classes[0].fields[14].type "featuredata"
+classes[0].fields[15].name "summaryfeatures"
+classes[0].fields[15].type "featuredata"
+classes[0].fields[16].name "snippet"
+classes[0].fields[16].type "longstring"
+classes[0].fields[17].name "snippet2"
+classes[0].fields[17].type "longstring"
+classes[0].fields[18].name "documentid"
+classes[0].fields[18].type "longstring"
+classes[1].id 109252281
+classes[1].name "summ"
+classes[1].fields[0].name "snippet"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "snippet2"
+classes[1].fields[1].type "longstring"
+classes[1].fields[2].name "rankfeatures"
+classes[1].fields[2].type "featuredata"
+classes[1].fields[3].name "summaryfeatures"
+classes[1].fields[3].type "featuredata" \ No newline at end of file
diff --git a/config-model/src/test/derived/twostreamingstructs/summarymap.cfg b/config-model/src/test/derived/twostreamingstructs/summarymap.cfg
new file mode 100644
index 00000000000..1bf13ffa199
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/summarymap.cfg
@@ -0,0 +1,13 @@
+defaultoutputclass -1
+override[0].field "snippet"
+override[0].command "dynamicteaser"
+override[0].arguments "snippet"
+override[1].field "rankfeatures"
+override[1].command "rankfeatures"
+override[1].arguments ""
+override[2].field "summaryfeatures"
+override[2].command "summaryfeatures"
+override[2].arguments ""
+override[3].field "g"
+override[3].command "dynamicteaser"
+override[3].arguments "g" \ No newline at end of file
diff --git a/config-model/src/test/derived/twostreamingstructs/vsmfields.cfg b/config-model/src/test/derived/twostreamingstructs/vsmfields.cfg
new file mode 100644
index 00000000000..ec8b1eeb4ac
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/vsmfields.cfg
@@ -0,0 +1,322 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "coupleof"
+fieldspec[0].searchmethod AUTOUTF8
+fieldspec[0].arg1 ""
+fieldspec[1].name "normalfields"
+fieldspec[1].searchmethod AUTOUTF8
+fieldspec[1].arg1 ""
+fieldspec[2].name "a.f1"
+fieldspec[2].searchmethod AUTOUTF8
+fieldspec[2].arg1 ""
+fieldspec[3].name "a.f1s"
+fieldspec[3].searchmethod AUTOUTF8
+fieldspec[3].arg1 "substring"
+fieldspec[4].name "a.f2"
+fieldspec[4].searchmethod INT32
+fieldspec[4].arg1 ""
+fieldspec[5].name "a.f3"
+fieldspec[5].searchmethod DOUBLE
+fieldspec[5].arg1 ""
+fieldspec[6].name "m.key"
+fieldspec[6].searchmethod INT64
+fieldspec[6].arg1 ""
+fieldspec[7].name "m.value"
+fieldspec[7].searchmethod AUTOUTF8
+fieldspec[7].arg1 ""
+fieldspec[8].name "b.f1"
+fieldspec[8].searchmethod AUTOUTF8
+fieldspec[8].arg1 ""
+fieldspec[9].name "b.f1s"
+fieldspec[9].searchmethod AUTOUTF8
+fieldspec[9].arg1 "substring"
+fieldspec[10].name "b.f2"
+fieldspec[10].searchmethod INT32
+fieldspec[10].arg1 ""
+fieldspec[11].name "b.f3"
+fieldspec[11].searchmethod DOUBLE
+fieldspec[11].arg1 ""
+fieldspec[12].name "c.f1"
+fieldspec[12].searchmethod AUTOUTF8
+fieldspec[12].arg1 ""
+fieldspec[13].name "c.f1s"
+fieldspec[13].searchmethod AUTOUTF8
+fieldspec[13].arg1 "prefix"
+fieldspec[14].name "c.f3"
+fieldspec[14].searchmethod DOUBLE
+fieldspec[14].arg1 ""
+fieldspec[15].name "c2.f1"
+fieldspec[15].searchmethod AUTOUTF8
+fieldspec[15].arg1 ""
+fieldspec[16].name "c2.f1s"
+fieldspec[16].searchmethod AUTOUTF8
+fieldspec[16].arg1 "suffix"
+fieldspec[17].name "c2.f2"
+fieldspec[17].searchmethod INT32
+fieldspec[17].arg1 ""
+fieldspec[18].name "c2.f3"
+fieldspec[18].searchmethod DOUBLE
+fieldspec[18].arg1 ""
+fieldspec[19].name "c3.f1"
+fieldspec[19].searchmethod AUTOUTF8
+fieldspec[19].arg1 ""
+fieldspec[20].name "c3.f1s"
+fieldspec[20].searchmethod AUTOUTF8
+fieldspec[20].arg1 "prefix"
+fieldspec[21].name "c3.f2"
+fieldspec[21].searchmethod INT32
+fieldspec[21].arg1 ""
+fieldspec[22].name "c3.f3"
+fieldspec[22].searchmethod DOUBLE
+fieldspec[22].arg1 ""
+fieldspec[23].name "n.nf1.f1"
+fieldspec[23].searchmethod AUTOUTF8
+fieldspec[23].arg1 ""
+fieldspec[24].name "n.nf1.f1s"
+fieldspec[24].searchmethod AUTOUTF8
+fieldspec[24].arg1 "prefix"
+fieldspec[25].name "n.nf1.f3"
+fieldspec[25].searchmethod DOUBLE
+fieldspec[25].arg1 ""
+fieldspec[26].name "n.nf1s.f1"
+fieldspec[26].searchmethod AUTOUTF8
+fieldspec[26].arg1 "substring"
+fieldspec[27].name "n.nf1s.f1s"
+fieldspec[27].searchmethod AUTOUTF8
+fieldspec[27].arg1 "substring"
+fieldspec[28].name "n.nf1s.f2"
+fieldspec[28].searchmethod INT32
+fieldspec[28].arg1 ""
+fieldspec[29].name "n.nf1s.f3"
+fieldspec[29].searchmethod DOUBLE
+fieldspec[29].arg1 ""
+fieldspec[30].name "n.nf2"
+fieldspec[30].searchmethod AUTOUTF8
+fieldspec[30].arg1 ""
+fieldspec[31].name "array1.f1"
+fieldspec[31].searchmethod AUTOUTF8
+fieldspec[31].arg1 ""
+fieldspec[32].name "array1.f1s"
+fieldspec[32].searchmethod AUTOUTF8
+fieldspec[32].arg1 "substring"
+fieldspec[33].name "array1.f2"
+fieldspec[33].searchmethod INT32
+fieldspec[33].arg1 ""
+fieldspec[34].name "array1.f3"
+fieldspec[34].searchmethod DOUBLE
+fieldspec[34].arg1 ""
+fieldspec[35].name "array2.f1"
+fieldspec[35].searchmethod AUTOUTF8
+fieldspec[35].arg1 ""
+fieldspec[36].name "array2.f1s"
+fieldspec[36].searchmethod AUTOUTF8
+fieldspec[36].arg1 "substring"
+fieldspec[37].name "array2.f2"
+fieldspec[37].searchmethod INT32
+fieldspec[37].arg1 ""
+fieldspec[38].name "array2.f3"
+fieldspec[38].searchmethod DOUBLE
+fieldspec[38].arg1 ""
+fieldspec[39].name "array3.f1"
+fieldspec[39].searchmethod AUTOUTF8
+fieldspec[39].arg1 ""
+fieldspec[40].name "array3.f1s"
+fieldspec[40].searchmethod AUTOUTF8
+fieldspec[40].arg1 "prefix"
+fieldspec[41].name "array3.f3"
+fieldspec[41].searchmethod DOUBLE
+fieldspec[41].arg1 ""
+fieldspec[42].name "subject.f1"
+fieldspec[42].searchmethod AUTOUTF8
+fieldspec[42].arg1 ""
+fieldspec[43].name "d.f1"
+fieldspec[43].searchmethod AUTOUTF8
+fieldspec[43].arg1 "prefix"
+fieldspec[44].name "d.f1s"
+fieldspec[44].searchmethod AUTOUTF8
+fieldspec[44].arg1 "prefix"
+fieldspec[45].name "d.f2"
+fieldspec[45].searchmethod INT32
+fieldspec[45].arg1 ""
+fieldspec[46].name "d.f3"
+fieldspec[46].searchmethod DOUBLE
+fieldspec[46].arg1 ""
+fieldspec[47].name "e.f1"
+fieldspec[47].searchmethod AUTOUTF8
+fieldspec[47].arg1 "substring"
+fieldspec[48].name "e.f1s"
+fieldspec[48].searchmethod AUTOUTF8
+fieldspec[48].arg1 "substring"
+fieldspec[49].name "e.f2"
+fieldspec[49].searchmethod INT32
+fieldspec[49].arg1 ""
+fieldspec[50].name "e.f3"
+fieldspec[50].searchmethod DOUBLE
+fieldspec[50].arg1 ""
+fieldspec[51].name "f.f1"
+fieldspec[51].searchmethod AUTOUTF8
+fieldspec[51].arg1 "suffix"
+fieldspec[52].name "f.f1s"
+fieldspec[52].searchmethod AUTOUTF8
+fieldspec[52].arg1 "suffix"
+fieldspec[53].name "f.f2"
+fieldspec[53].searchmethod INT32
+fieldspec[53].arg1 ""
+fieldspec[54].name "f.f3"
+fieldspec[54].searchmethod DOUBLE
+fieldspec[54].arg1 ""
+fieldspec[55].name "g"
+fieldspec[55].searchmethod AUTOUTF8
+fieldspec[55].arg1 ""
+documenttype[0].name "streamingstruct"
+documenttype[0].index[0].name "coupleof"
+documenttype[0].index[0].field[0].name "coupleof"
+documenttype[0].index[1].name "normalfields"
+documenttype[0].index[1].field[0].name "normalfields"
+documenttype[0].index[2].name "b"
+documenttype[0].index[2].field[0].name "b.f1"
+documenttype[0].index[2].field[1].name "b.f1s"
+documenttype[0].index[2].field[2].name "b.f2"
+documenttype[0].index[2].field[3].name "b.f3"
+documenttype[0].index[3].name "b.f1"
+documenttype[0].index[3].field[0].name "b.f1"
+documenttype[0].index[4].name "b.f1s"
+documenttype[0].index[4].field[0].name "b.f1s"
+documenttype[0].index[5].name "b.f2"
+documenttype[0].index[5].field[0].name "b.f2"
+documenttype[0].index[6].name "b.f3"
+documenttype[0].index[6].field[0].name "b.f3"
+documenttype[0].index[7].name "c"
+documenttype[0].index[7].field[0].name "c.f1"
+documenttype[0].index[7].field[1].name "c.f1s"
+documenttype[0].index[7].field[2].name "c.f3"
+documenttype[0].index[8].name "c.f1"
+documenttype[0].index[8].field[0].name "c.f1"
+documenttype[0].index[9].name "c.f1s"
+documenttype[0].index[9].field[0].name "c.f1s"
+documenttype[0].index[10].name "c.f3"
+documenttype[0].index[10].field[0].name "c.f3"
+documenttype[0].index[11].name "c2"
+documenttype[0].index[11].field[0].name "c2.f1"
+documenttype[0].index[11].field[1].name "c2.f1s"
+documenttype[0].index[11].field[2].name "c2.f2"
+documenttype[0].index[11].field[3].name "c2.f3"
+documenttype[0].index[12].name "c2.f1"
+documenttype[0].index[12].field[0].name "c2.f1"
+documenttype[0].index[13].name "c2.f1s"
+documenttype[0].index[13].field[0].name "c2.f1s"
+documenttype[0].index[14].name "c2.f2"
+documenttype[0].index[14].field[0].name "c2.f2"
+documenttype[0].index[15].name "c2.f3"
+documenttype[0].index[15].field[0].name "c2.f3"
+documenttype[0].index[16].name "c3"
+documenttype[0].index[16].field[0].name "c3.f1"
+documenttype[0].index[16].field[1].name "c3.f1s"
+documenttype[0].index[16].field[2].name "c3.f2"
+documenttype[0].index[16].field[3].name "c3.f3"
+documenttype[0].index[17].name "c3.f1"
+documenttype[0].index[17].field[0].name "c3.f1"
+documenttype[0].index[18].name "c3.f1s"
+documenttype[0].index[18].field[0].name "c3.f1s"
+documenttype[0].index[19].name "c3.f2"
+documenttype[0].index[19].field[0].name "c3.f2"
+documenttype[0].index[20].name "c3.f3"
+documenttype[0].index[20].field[0].name "c3.f3"
+documenttype[0].index[21].name "n"
+documenttype[0].index[21].field[0].name "n.nf1.f1"
+documenttype[0].index[21].field[1].name "n.nf1.f1s"
+documenttype[0].index[21].field[2].name "n.nf1.f3"
+documenttype[0].index[21].field[3].name "n.nf1s.f1"
+documenttype[0].index[21].field[4].name "n.nf1s.f1s"
+documenttype[0].index[21].field[5].name "n.nf1s.f2"
+documenttype[0].index[21].field[6].name "n.nf1s.f3"
+documenttype[0].index[21].field[7].name "n.nf2"
+documenttype[0].index[22].name "n.nf1"
+documenttype[0].index[22].field[0].name "n.nf1.f1"
+documenttype[0].index[22].field[1].name "n.nf1.f1s"
+documenttype[0].index[22].field[2].name "n.nf1.f3"
+documenttype[0].index[23].name "n.nf1.f1"
+documenttype[0].index[23].field[0].name "n.nf1.f1"
+documenttype[0].index[24].name "n.nf1.f1s"
+documenttype[0].index[24].field[0].name "n.nf1.f1s"
+documenttype[0].index[25].name "n.nf1.f3"
+documenttype[0].index[25].field[0].name "n.nf1.f3"
+documenttype[0].index[26].name "n.nf1s"
+documenttype[0].index[26].field[0].name "n.nf1s.f1"
+documenttype[0].index[26].field[1].name "n.nf1s.f1s"
+documenttype[0].index[26].field[2].name "n.nf1s.f2"
+documenttype[0].index[26].field[3].name "n.nf1s.f3"
+documenttype[0].index[27].name "n.nf1s.f1"
+documenttype[0].index[27].field[0].name "n.nf1s.f1"
+documenttype[0].index[28].name "n.nf1s.f1s"
+documenttype[0].index[28].field[0].name "n.nf1s.f1s"
+documenttype[0].index[29].name "n.nf1s.f2"
+documenttype[0].index[29].field[0].name "n.nf1s.f2"
+documenttype[0].index[30].name "n.nf1s.f3"
+documenttype[0].index[30].field[0].name "n.nf1s.f3"
+documenttype[0].index[31].name "n.nf2"
+documenttype[0].index[31].field[0].name "n.nf2"
+documenttype[0].index[32].name "array2"
+documenttype[0].index[32].field[0].name "array2.f1"
+documenttype[0].index[32].field[1].name "array2.f1s"
+documenttype[0].index[32].field[2].name "array2.f2"
+documenttype[0].index[32].field[3].name "array2.f3"
+documenttype[0].index[33].name "array2.f1"
+documenttype[0].index[33].field[0].name "array2.f1"
+documenttype[0].index[34].name "array2.f1s"
+documenttype[0].index[34].field[0].name "array2.f1s"
+documenttype[0].index[35].name "array2.f2"
+documenttype[0].index[35].field[0].name "array2.f2"
+documenttype[0].index[36].name "array2.f3"
+documenttype[0].index[36].field[0].name "array2.f3"
+documenttype[0].index[37].name "array3"
+documenttype[0].index[37].field[0].name "array3.f1"
+documenttype[0].index[37].field[1].name "array3.f1s"
+documenttype[0].index[37].field[2].name "array3.f3"
+documenttype[0].index[38].name "array3.f1"
+documenttype[0].index[38].field[0].name "array3.f1"
+documenttype[0].index[39].name "array3.f1s"
+documenttype[0].index[39].field[0].name "array3.f1s"
+documenttype[0].index[40].name "array3.f3"
+documenttype[0].index[40].field[0].name "array3.f3"
+documenttype[0].index[41].name "d"
+documenttype[0].index[41].field[0].name "d.f1"
+documenttype[0].index[41].field[1].name "d.f1s"
+documenttype[0].index[41].field[2].name "d.f2"
+documenttype[0].index[41].field[3].name "d.f3"
+documenttype[0].index[42].name "d.f1"
+documenttype[0].index[42].field[0].name "d.f1"
+documenttype[0].index[43].name "d.f1s"
+documenttype[0].index[43].field[0].name "d.f1s"
+documenttype[0].index[44].name "d.f2"
+documenttype[0].index[44].field[0].name "d.f2"
+documenttype[0].index[45].name "d.f3"
+documenttype[0].index[45].field[0].name "d.f3"
+documenttype[0].index[46].name "e"
+documenttype[0].index[46].field[0].name "e.f1"
+documenttype[0].index[46].field[1].name "e.f1s"
+documenttype[0].index[46].field[2].name "e.f2"
+documenttype[0].index[46].field[3].name "e.f3"
+documenttype[0].index[47].name "e.f1"
+documenttype[0].index[47].field[0].name "e.f1"
+documenttype[0].index[48].name "e.f1s"
+documenttype[0].index[48].field[0].name "e.f1s"
+documenttype[0].index[49].name "e.f2"
+documenttype[0].index[49].field[0].name "e.f2"
+documenttype[0].index[50].name "e.f3"
+documenttype[0].index[50].field[0].name "e.f3"
+documenttype[0].index[51].name "f"
+documenttype[0].index[51].field[0].name "f.f1"
+documenttype[0].index[51].field[1].name "f.f1s"
+documenttype[0].index[51].field[2].name "f.f2"
+documenttype[0].index[51].field[3].name "f.f3"
+documenttype[0].index[52].name "f.f1"
+documenttype[0].index[52].field[0].name "f.f1"
+documenttype[0].index[53].name "f.f1s"
+documenttype[0].index[53].field[0].name "f.f1s"
+documenttype[0].index[54].name "f.f2"
+documenttype[0].index[54].field[0].name "f.f2"
+documenttype[0].index[55].name "f.f3"
+documenttype[0].index[55].field[0].name "f.f3"
+documenttype[0].index[56].name "g"
+documenttype[0].index[56].field[0].name "g" \ No newline at end of file
diff --git a/config-model/src/test/derived/twostreamingstructs/vsmsummary.cfg b/config-model/src/test/derived/twostreamingstructs/vsmsummary.cfg
new file mode 100644
index 00000000000..b7a75932f5c
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/vsmsummary.cfg
@@ -0,0 +1,83 @@
+outputclass ""
+fieldmap[0].summary "coupleof"
+fieldmap[0].document[0].field "coupleof"
+fieldmap[0].command NONE
+fieldmap[1].summary "anothersummaryfield"
+fieldmap[1].document[0].field "normalfields"
+fieldmap[1].command NONE
+fieldmap[2].summary "a"
+fieldmap[2].document[0].field "a.f1"
+fieldmap[2].document[1].field "a.f1s"
+fieldmap[2].document[2].field "a.f2"
+fieldmap[2].document[3].field "a.f3"
+fieldmap[2].command NONE
+fieldmap[3].summary "m"
+fieldmap[3].document[0].field "m"
+fieldmap[3].command NONE
+fieldmap[4].summary "b"
+fieldmap[4].document[0].field "b.f1"
+fieldmap[4].document[1].field "b.f1s"
+fieldmap[4].document[2].field "b.f2"
+fieldmap[4].document[3].field "b.f3"
+fieldmap[4].command NONE
+fieldmap[5].summary "c"
+fieldmap[5].document[0].field "c.f1"
+fieldmap[5].document[1].field "c.f1s"
+fieldmap[5].document[2].field "c.f3"
+fieldmap[5].command NONE
+fieldmap[6].summary "c2"
+fieldmap[6].document[0].field "c2.f1"
+fieldmap[6].document[1].field "c2.f1s"
+fieldmap[6].document[2].field "c2.f2"
+fieldmap[6].document[3].field "c2.f3"
+fieldmap[6].command NONE
+fieldmap[7].summary "c3"
+fieldmap[7].document[0].field "c3.f1"
+fieldmap[7].document[1].field "c3.f2"
+fieldmap[7].document[2].field "c3.f3"
+fieldmap[7].command NONE
+fieldmap[8].summary "n"
+fieldmap[8].document[0].field "n.nf1.f1"
+fieldmap[8].document[1].field "n.nf1.f1s"
+fieldmap[8].document[2].field "n.nf1s.f1"
+fieldmap[8].document[3].field "n.nf1s.f1s"
+fieldmap[8].document[4].field "n.nf1s.f2"
+fieldmap[8].document[5].field "n.nf1s.f3"
+fieldmap[8].document[6].field "n.nf2"
+fieldmap[8].command NONE
+fieldmap[9].summary "array1"
+fieldmap[9].document[0].field "array1.f1"
+fieldmap[9].document[1].field "array1.f1s"
+fieldmap[9].document[2].field "array1.f2"
+fieldmap[9].document[3].field "array1.f3"
+fieldmap[9].command NONE
+fieldmap[10].summary "array2"
+fieldmap[10].document[0].field "array2.f1"
+fieldmap[10].document[1].field "array2.f1s"
+fieldmap[10].document[2].field "array2.f2"
+fieldmap[10].document[3].field "array2.f3"
+fieldmap[10].command NONE
+fieldmap[11].summary "array3"
+fieldmap[11].document[0].field "array3.f1"
+fieldmap[11].document[1].field "array3.f1s"
+fieldmap[11].document[2].field "array3.f3"
+fieldmap[11].command NONE
+fieldmap[12].summary "subject"
+fieldmap[12].document[0].field "subject.f1"
+fieldmap[12].command NONE
+fieldmap[13].summary "g"
+fieldmap[13].document[0].field "g"
+fieldmap[13].command FLATTENJUNIPER
+fieldmap[14].summary "rankfeatures"
+fieldmap[14].command NONE
+fieldmap[15].summary "summaryfeatures"
+fieldmap[15].command NONE
+fieldmap[16].summary "snippet"
+fieldmap[16].document[0].field "a.f1"
+fieldmap[16].document[1].field "b.f2"
+fieldmap[16].command FLATTENJUNIPER
+fieldmap[17].summary "snippet2"
+fieldmap[17].document[0].field "a.f1"
+fieldmap[17].document[1].field "b.f1"
+fieldmap[17].document[2].field "b.f2"
+fieldmap[17].command FLATTENSPACE \ No newline at end of file
diff --git a/config-model/src/test/derived/twostreamingstructs/whatever.sd b/config-model/src/test/derived/twostreamingstructs/whatever.sd
new file mode 100644
index 00000000000..0ddc655df15
--- /dev/null
+++ b/config-model/src/test/derived/twostreamingstructs/whatever.sd
@@ -0,0 +1,16 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search whatever {
+
+ document whatever {
+ struct pair {
+ field key type string {}
+ field value type string {}
+ }
+
+ field f1 type pair {
+ indexing: summary
+ body
+ }
+ }
+
+}
diff --git a/config-model/src/test/derived/types/attributes.cfg b/config-model/src/test/derived/types/attributes.cfg
new file mode 100644
index 00000000000..f20562d2a3c
--- /dev/null
+++ b/config-model/src/test/derived/types/attributes.cfg
@@ -0,0 +1,209 @@
+attribute[0].name "abyte"
+attribute[0].datatype INT8
+attribute[0].collectiontype SINGLE
+attribute[0].removeifzero false
+attribute[0].createifnonexistent false
+attribute[0].fastsearch false
+attribute[0].huge false
+attribute[0].sortascending true
+attribute[0].sortfunction UCA
+attribute[0].sortstrength PRIMARY
+attribute[0].sortlocale ""
+attribute[0].enablebitvectors false
+attribute[0].enableonlybitvector false
+attribute[0].fastaccess false
+attribute[0].arity 8
+attribute[0].lowerbound -9223372036854775808
+attribute[0].upperbound 9223372036854775807
+attribute[0].densepostinglistthreshold 0.4
+attribute[0].tensortype ""
+attribute[1].name "along"
+attribute[1].datatype INT64
+attribute[1].collectiontype SINGLE
+attribute[1].removeifzero false
+attribute[1].createifnonexistent false
+attribute[1].fastsearch false
+attribute[1].huge false
+attribute[1].sortascending true
+attribute[1].sortfunction UCA
+attribute[1].sortstrength PRIMARY
+attribute[1].sortlocale ""
+attribute[1].enablebitvectors false
+attribute[1].enableonlybitvector false
+attribute[1].fastaccess false
+attribute[1].arity 8
+attribute[1].lowerbound -9223372036854775808
+attribute[1].upperbound 9223372036854775807
+attribute[1].densepostinglistthreshold 0.4
+attribute[1].tensortype ""
+attribute[2].name "arrayfield"
+attribute[2].datatype INT32
+attribute[2].collectiontype ARRAY
+attribute[2].removeifzero false
+attribute[2].createifnonexistent false
+attribute[2].fastsearch false
+attribute[2].huge false
+attribute[2].sortascending true
+attribute[2].sortfunction UCA
+attribute[2].sortstrength PRIMARY
+attribute[2].sortlocale ""
+attribute[2].enablebitvectors false
+attribute[2].enableonlybitvector false
+attribute[2].fastaccess false
+attribute[2].arity 8
+attribute[2].lowerbound -9223372036854775808
+attribute[2].upperbound 9223372036854775807
+attribute[2].densepostinglistthreshold 0.4
+attribute[2].tensortype ""
+attribute[3].name "setfield"
+attribute[3].datatype STRING
+attribute[3].collectiontype WEIGHTEDSET
+attribute[3].removeifzero false
+attribute[3].createifnonexistent false
+attribute[3].fastsearch false
+attribute[3].huge false
+attribute[3].sortascending true
+attribute[3].sortfunction UCA
+attribute[3].sortstrength PRIMARY
+attribute[3].sortlocale ""
+attribute[3].enablebitvectors false
+attribute[3].enableonlybitvector false
+attribute[3].fastaccess false
+attribute[3].arity 8
+attribute[3].lowerbound -9223372036854775808
+attribute[3].upperbound 9223372036854775807
+attribute[3].densepostinglistthreshold 0.4
+attribute[3].tensortype ""
+attribute[4].name "setfield2"
+attribute[4].datatype STRING
+attribute[4].collectiontype WEIGHTEDSET
+attribute[4].removeifzero true
+attribute[4].createifnonexistent true
+attribute[4].fastsearch false
+attribute[4].huge false
+attribute[4].sortascending true
+attribute[4].sortfunction UCA
+attribute[4].sortstrength PRIMARY
+attribute[4].sortlocale ""
+attribute[4].enablebitvectors false
+attribute[4].enableonlybitvector false
+attribute[4].fastaccess false
+attribute[4].arity 8
+attribute[4].lowerbound -9223372036854775808
+attribute[4].upperbound 9223372036854775807
+attribute[4].densepostinglistthreshold 0.4
+attribute[4].tensortype ""
+attribute[5].name "setfield3"
+attribute[5].datatype STRING
+attribute[5].collectiontype WEIGHTEDSET
+attribute[5].removeifzero true
+attribute[5].createifnonexistent false
+attribute[5].fastsearch false
+attribute[5].huge false
+attribute[5].sortascending true
+attribute[5].sortfunction UCA
+attribute[5].sortstrength PRIMARY
+attribute[5].sortlocale ""
+attribute[5].enablebitvectors false
+attribute[5].enableonlybitvector false
+attribute[5].fastaccess false
+attribute[5].arity 8
+attribute[5].lowerbound -9223372036854775808
+attribute[5].upperbound 9223372036854775807
+attribute[5].densepostinglistthreshold 0.4
+attribute[5].tensortype ""
+attribute[6].name "setfield4"
+attribute[6].datatype STRING
+attribute[6].collectiontype WEIGHTEDSET
+attribute[6].removeifzero false
+attribute[6].createifnonexistent true
+attribute[6].fastsearch false
+attribute[6].huge false
+attribute[6].sortascending true
+attribute[6].sortfunction UCA
+attribute[6].sortstrength PRIMARY
+attribute[6].sortlocale ""
+attribute[6].enablebitvectors false
+attribute[6].enableonlybitvector false
+attribute[6].fastaccess false
+attribute[6].arity 8
+attribute[6].lowerbound -9223372036854775808
+attribute[6].upperbound 9223372036854775807
+attribute[6].densepostinglistthreshold 0.4
+attribute[6].tensortype ""
+attribute[7].name "tagfield"
+attribute[7].datatype STRING
+attribute[7].collectiontype WEIGHTEDSET
+attribute[7].removeifzero true
+attribute[7].createifnonexistent true
+attribute[7].fastsearch false
+attribute[7].huge false
+attribute[7].sortascending true
+attribute[7].sortfunction UCA
+attribute[7].sortstrength PRIMARY
+attribute[7].sortlocale ""
+attribute[7].enablebitvectors false
+attribute[7].enableonlybitvector false
+attribute[7].fastaccess false
+attribute[7].arity 8
+attribute[7].lowerbound -9223372036854775808
+attribute[7].upperbound 9223372036854775807
+attribute[7].densepostinglistthreshold 0.4
+attribute[7].tensortype ""
+attribute[8].name "juletre"
+attribute[8].datatype INT64
+attribute[8].collectiontype SINGLE
+attribute[8].removeifzero false
+attribute[8].createifnonexistent false
+attribute[8].fastsearch true
+attribute[8].huge false
+attribute[8].sortascending true
+attribute[8].sortfunction UCA
+attribute[8].sortstrength PRIMARY
+attribute[8].sortlocale ""
+attribute[8].enablebitvectors false
+attribute[8].enableonlybitvector false
+attribute[8].fastaccess false
+attribute[8].arity 8
+attribute[8].lowerbound -9223372036854775808
+attribute[8].upperbound 9223372036854775807
+attribute[8].densepostinglistthreshold 0.4
+attribute[8].tensortype ""
+attribute[9].name "album1"
+attribute[9].datatype STRING
+attribute[9].collectiontype WEIGHTEDSET
+attribute[9].removeifzero true
+attribute[9].createifnonexistent true
+attribute[9].fastsearch false
+attribute[9].huge false
+attribute[9].sortascending true
+attribute[9].sortfunction UCA
+attribute[9].sortstrength PRIMARY
+attribute[9].sortlocale ""
+attribute[9].enablebitvectors false
+attribute[9].enableonlybitvector false
+attribute[9].fastaccess false
+attribute[9].arity 8
+attribute[9].lowerbound -9223372036854775808
+attribute[9].upperbound 9223372036854775807
+attribute[9].densepostinglistthreshold 0.4
+attribute[9].tensortype ""
+attribute[10].name "other"
+attribute[10].datatype INT64
+attribute[10].collectiontype SINGLE
+attribute[10].removeifzero false
+attribute[10].createifnonexistent false
+attribute[10].fastsearch false
+attribute[10].huge false
+attribute[10].sortascending true
+attribute[10].sortfunction UCA
+attribute[10].sortstrength PRIMARY
+attribute[10].sortlocale ""
+attribute[10].enablebitvectors false
+attribute[10].enableonlybitvector false
+attribute[10].fastaccess false
+attribute[10].arity 8
+attribute[10].lowerbound -9223372036854775808
+attribute[10].upperbound 9223372036854775807
+attribute[10].densepostinglistthreshold 0.4
+attribute[10].tensortype ""
diff --git a/config-model/src/test/derived/types/documentmanager.cfg b/config-model/src/test/derived/types/documentmanager.cfg
new file mode 100644
index 00000000000..a2018ffa195
--- /dev/null
+++ b/config-model/src/test/derived/types/documentmanager.cfg
@@ -0,0 +1,218 @@
+enablecompression false
+datatype[0].id 1381038251
+datatype[0].structtype[0].name "position"
+datatype[0].structtype[0].version 0
+datatype[0].structtype[0].compresstype NONE
+datatype[0].structtype[0].compresslevel 0
+datatype[0].structtype[0].compressthreshold 95
+datatype[0].structtype[0].compressminsize 800
+datatype[0].structtype[0].field[0].name "x"
+datatype[0].structtype[0].field[0].datatype 0
+datatype[0].structtype[0].field[1].name "y"
+datatype[0].structtype[0].field[1].datatype 0
+datatype[1].id -1865479609
+datatype[1].maptype[0].keytype 2
+datatype[1].maptype[0].valtype 4
+datatype[2].id 294108848
+datatype[2].structtype[0].name "folder"
+datatype[2].structtype[0].version 0
+datatype[2].structtype[0].compresstype NONE
+datatype[2].structtype[0].compresslevel 0
+datatype[2].structtype[0].compressthreshold 95
+datatype[2].structtype[0].compressminsize 800
+datatype[2].structtype[0].field[0].name "Version"
+datatype[2].structtype[0].field[0].datatype 0
+datatype[2].structtype[0].field[1].name "Name"
+datatype[2].structtype[0].field[1].datatype 2
+datatype[2].structtype[0].field[2].name "FlagsCounter"
+datatype[2].structtype[0].field[2].datatype -1865479609
+datatype[2].structtype[0].field[3].name "anotherfolder"
+datatype[2].structtype[0].field[3].datatype 294108848
+datatype[3].id 109267174
+datatype[3].structtype[0].name "sct"
+datatype[3].structtype[0].version 0
+datatype[3].structtype[0].compresstype NONE
+datatype[3].structtype[0].compresslevel 0
+datatype[3].structtype[0].compressthreshold 95
+datatype[3].structtype[0].compressminsize 800
+datatype[3].structtype[0].field[0].name "s1"
+datatype[3].structtype[0].field[0].datatype 2
+datatype[3].structtype[0].field[1].name "s2"
+datatype[3].structtype[0].field[1].datatype 2
+datatype[4].id 49942803
+datatype[4].arraytype[0].datatype 16
+datatype[5].id 339965458
+datatype[5].maptype[0].keytype 2
+datatype[5].maptype[0].valtype 2
+datatype[6].id -2092985853
+datatype[6].structtype[0].name "mystruct"
+datatype[6].structtype[0].version 0
+datatype[6].structtype[0].compresstype NONE
+datatype[6].structtype[0].compresslevel 0
+datatype[6].structtype[0].compressthreshold 95
+datatype[6].structtype[0].compressminsize 800
+datatype[6].structtype[0].field[0].name "bytearr"
+datatype[6].structtype[0].field[0].datatype 49942803
+datatype[6].structtype[0].field[1].name "mymap"
+datatype[6].structtype[0].field[1].datatype 339965458
+datatype[6].structtype[0].field[2].name "title"
+datatype[6].structtype[0].field[2].datatype 2
+datatype[6].structtype[0].field[3].name "structfield"
+datatype[6].structtype[0].field[3].datatype 2
+datatype[7].id -1245117006
+datatype[7].arraytype[0].datatype 0
+datatype[8].id 1328286588
+datatype[8].weightedsettype[0].datatype 2
+datatype[8].weightedsettype[0].createifnonexistant false
+datatype[8].weightedsettype[0].removeifzero false
+datatype[9].id 2125328771
+datatype[9].weightedsettype[0].datatype 2
+datatype[9].weightedsettype[0].createifnonexistant false
+datatype[9].weightedsettype[0].removeifzero true
+datatype[10].id 2065577986
+datatype[10].weightedsettype[0].datatype 2
+datatype[10].weightedsettype[0].createifnonexistant true
+datatype[10].weightedsettype[0].removeifzero false
+datatype[11].id -1244829667
+datatype[11].arraytype[0].datatype 109267174
+datatype[12].id -1584287606
+datatype[12].maptype[0].keytype 2
+datatype[12].maptype[0].valtype 0
+datatype[13].id 2125154557
+datatype[13].maptype[0].keytype 2
+datatype[13].maptype[0].valtype 1
+datatype[14].id -1715531035
+datatype[14].maptype[0].keytype 0
+datatype[14].maptype[0].valtype 4
+datatype[15].id 2138385264
+datatype[15].maptype[0].keytype 0
+datatype[15].maptype[0].valtype 5
+datatype[16].id 435886609
+datatype[16].maptype[0].keytype 2
+datatype[16].maptype[0].valtype -1245117006
+datatype[17].id -1486737430
+datatype[17].arraytype[0].datatype 2
+datatype[18].id 1707615575
+datatype[18].arraytype[0].datatype -1486737430
+datatype[19].id -794985308
+datatype[19].arraytype[0].datatype 1707615575
+datatype[20].id 69621385
+datatype[20].arraytype[0].datatype 339965458
+datatype[21].id 1901258752
+datatype[21].maptype[0].keytype 0
+datatype[21].maptype[0].valtype -2092985853
+datatype[22].id 759956026
+datatype[22].arraytype[0].datatype -2092985853
+datatype[23].id -389833101
+datatype[23].maptype[0].keytype 0
+datatype[23].maptype[0].valtype 294108848
+datatype[24].id 1328581348
+datatype[24].structtype[0].name "types.header"
+datatype[24].structtype[0].version 0
+datatype[24].structtype[0].compresstype NONE
+datatype[24].structtype[0].compresslevel 0
+datatype[24].structtype[0].compressthreshold 95
+datatype[24].structtype[0].compressminsize 800
+datatype[24].structtype[0].field[0].name "abyte"
+datatype[24].structtype[0].field[0].datatype 16
+datatype[24].structtype[0].field[1].name "along"
+datatype[24].structtype[0].field[1].datatype 4
+datatype[24].structtype[0].field[2].name "arrayfield"
+datatype[24].structtype[0].field[2].datatype -1245117006
+datatype[24].structtype[0].field[3].name "setfield"
+datatype[24].structtype[0].field[3].datatype 1328286588
+datatype[24].structtype[0].field[4].name "setfield2"
+datatype[24].structtype[0].field[4].datatype 18
+datatype[24].structtype[0].field[5].name "setfield3"
+datatype[24].structtype[0].field[5].datatype 2125328771
+datatype[24].structtype[0].field[6].name "setfield4"
+datatype[24].structtype[0].field[6].datatype 2065577986
+datatype[24].structtype[0].field[7].name "tagfield"
+datatype[24].structtype[0].field[7].datatype 18
+datatype[24].structtype[0].field[8].name "structfield"
+datatype[24].structtype[0].field[8].datatype 109267174
+datatype[24].structtype[0].field[9].name "structarrayfield"
+datatype[24].structtype[0].field[9].datatype -1244829667
+datatype[24].structtype[0].field[10].name "stringmapfield"
+datatype[24].structtype[0].field[10].datatype 339965458
+datatype[24].structtype[0].field[11].name "intmapfield"
+datatype[24].structtype[0].field[11].datatype -1584287606
+datatype[24].structtype[0].field[12].name "floatmapfield"
+datatype[24].structtype[0].field[12].datatype 2125154557
+datatype[24].structtype[0].field[13].name "longmapfield"
+datatype[24].structtype[0].field[13].datatype -1715531035
+datatype[24].structtype[0].field[14].name "doublemapfield"
+datatype[24].structtype[0].field[14].datatype 2138385264
+datatype[24].structtype[0].field[15].name "arraymapfield"
+datatype[24].structtype[0].field[15].datatype 435886609
+datatype[24].structtype[0].field[16].name "arrarr"
+datatype[24].structtype[0].field[16].datatype -794985308
+datatype[24].structtype[0].field[17].name "maparr"
+datatype[24].structtype[0].field[17].datatype 69621385
+datatype[24].structtype[0].field[18].name "mystructfield"
+datatype[24].structtype[0].field[18].datatype -2092985853
+datatype[24].structtype[0].field[19].name "mystructmap"
+datatype[24].structtype[0].field[19].datatype 1901258752
+datatype[24].structtype[0].field[20].name "mystructarr"
+datatype[24].structtype[0].field[20].datatype 759956026
+datatype[24].structtype[0].field[21].name "Folders"
+datatype[24].structtype[0].field[21].datatype -389833101
+datatype[24].structtype[0].field[22].name "juletre"
+datatype[24].structtype[0].field[22].datatype 4
+datatype[24].structtype[0].field[23].name "album0"
+datatype[24].structtype[0].field[23].datatype 18
+datatype[24].structtype[0].field[24].name "album1"
+datatype[24].structtype[0].field[24].datatype 18
+datatype[24].structtype[0].field[25].name "other"
+datatype[24].structtype[0].field[25].datatype 4
+datatype[24].structtype[0].field[26].name "rankfeatures"
+datatype[24].structtype[0].field[26].datatype 2
+datatype[24].structtype[0].field[27].name "summaryfeatures"
+datatype[24].structtype[0].field[27].datatype 2
+datatype[25].id 171503364
+datatype[25].maptype[0].keytype 1707615575
+datatype[25].maptype[0].valtype 0
+datatype[26].id 1100964733
+datatype[26].arraytype[0].datatype 171503364
+datatype[27].id 348447225
+datatype[27].structtype[0].name "types.body"
+datatype[27].structtype[0].version 0
+datatype[27].structtype[0].compresstype NONE
+datatype[27].structtype[0].compresslevel 0
+datatype[27].structtype[0].compressthreshold 95
+datatype[27].structtype[0].compressminsize 800
+datatype[27].structtype[0].field[0].name "complexarray"
+datatype[27].structtype[0].field[0].datatype 1100964733
+datatype[28].id -853072901
+datatype[28].documenttype[0].name "types"
+datatype[28].documenttype[0].version 0
+datatype[28].documenttype[0].inherits[0].name "document"
+datatype[28].documenttype[0].inherits[0].version 0
+datatype[28].documenttype[0].headerstruct 1328581348
+datatype[28].documenttype[0].bodystruct 348447225
+datatype[28].documenttype[0].fieldsets{[document]}.fields[0] "Folders"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[1] "abyte"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[2] "album0"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[3] "album1"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[4] "along"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[5] "arrarr"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[6] "arrayfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[7] "arraymapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[8] "complexarray"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[9] "doublemapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[10] "floatmapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[11] "intmapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[12] "juletre"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[13] "longmapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[14] "maparr"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[15] "mystructarr"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[16] "mystructfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[17] "mystructmap"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[18] "setfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[19] "setfield2"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[20] "setfield3"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[21] "setfield4"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[22] "stringmapfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[23] "structarrayfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[24] "structfield"
+datatype[28].documenttype[0].fieldsets{[document]}.fields[25] "tagfield"
diff --git a/config-model/src/test/derived/types/ilscripts.cfg b/config-model/src/test/derived/types/ilscripts.cfg
new file mode 100644
index 00000000000..cc692e120be
--- /dev/null
+++ b/config-model/src/test/derived/types/ilscripts.cfg
@@ -0,0 +1,55 @@
+maxtermoccurrences 100
+ilscript[0].doctype "types"
+ilscript[0].docfield[0] "abyte"
+ilscript[0].docfield[1] "along"
+ilscript[0].docfield[2] "arrayfield"
+ilscript[0].docfield[3] "setfield"
+ilscript[0].docfield[4] "setfield2"
+ilscript[0].docfield[5] "setfield3"
+ilscript[0].docfield[6] "setfield4"
+ilscript[0].docfield[7] "tagfield"
+ilscript[0].docfield[8] "structfield"
+ilscript[0].docfield[9] "structarrayfield"
+ilscript[0].docfield[10] "stringmapfield"
+ilscript[0].docfield[11] "intmapfield"
+ilscript[0].docfield[12] "floatmapfield"
+ilscript[0].docfield[13] "longmapfield"
+ilscript[0].docfield[14] "doublemapfield"
+ilscript[0].docfield[15] "arraymapfield"
+ilscript[0].docfield[16] "arrarr"
+ilscript[0].docfield[17] "maparr"
+ilscript[0].docfield[18] "mystructfield"
+ilscript[0].docfield[19] "mystructmap"
+ilscript[0].docfield[20] "mystructarr"
+ilscript[0].docfield[21] "Folders"
+ilscript[0].docfield[22] "juletre"
+ilscript[0].docfield[23] "album0"
+ilscript[0].docfield[24] "album1"
+ilscript[0].docfield[25] "complexarray"
+ilscript[0].content[0] "clear_state | guard { input along | attribute other; }"
+ilscript[0].content[1] "clear_state | guard { input abyte | summary abyte | attribute abyte; }"
+ilscript[0].content[2] "clear_state | guard { input along | summary along | attribute along; }"
+ilscript[0].content[3] "clear_state | guard { input arrayfield | attribute arrayfield; }"
+ilscript[0].content[4] "clear_state | guard { input setfield | attribute setfield; }"
+ilscript[0].content[5] "clear_state | guard { input setfield2 | attribute setfield2; }"
+ilscript[0].content[6] "clear_state | guard { input setfield3 | attribute setfield3; }"
+ilscript[0].content[7] "clear_state | guard { input setfield4 | attribute setfield4; }"
+ilscript[0].content[8] "clear_state | guard { input tagfield | attribute tagfield | summary tagfield; }"
+ilscript[0].content[9] "clear_state | guard { input juletre | attribute juletre; }"
+ilscript[0].content[10] "clear_state | guard { input album0 | summary album0; }"
+ilscript[0].content[11] "clear_state | guard { input album1 | attribute album1 | summary album1; }"
+ilscript[0].content[12] "input Folders | passthrough Folders"
+ilscript[0].content[13] "input arrarr | passthrough arrarr"
+ilscript[0].content[14] "input arraymapfield | passthrough arraymapfield"
+ilscript[0].content[15] "input complexarray | passthrough complexarray"
+ilscript[0].content[16] "input doublemapfield | passthrough doublemapfield"
+ilscript[0].content[17] "input floatmapfield | passthrough floatmapfield"
+ilscript[0].content[18] "input intmapfield | passthrough intmapfield"
+ilscript[0].content[19] "input longmapfield | passthrough longmapfield"
+ilscript[0].content[20] "input maparr | passthrough maparr"
+ilscript[0].content[21] "input mystructarr | passthrough mystructarr"
+ilscript[0].content[22] "input mystructfield | passthrough mystructfield"
+ilscript[0].content[23] "input mystructmap | passthrough mystructmap"
+ilscript[0].content[24] "input stringmapfield | passthrough stringmapfield"
+ilscript[0].content[25] "input structarrayfield | passthrough structarrayfield"
+ilscript[0].content[26] "input structfield | passthrough structfield"
diff --git a/config-model/src/test/derived/types/index-info.cfg b/config-model/src/test/derived/types/index-info.cfg
new file mode 100644
index 00000000000..4b94127c687
--- /dev/null
+++ b/config-model/src/test/derived/types/index-info.cfg
@@ -0,0 +1,427 @@
+indexinfo[0].name "types"
+indexinfo[0].command[0].indexname "sddocname"
+indexinfo[0].command[0].command "index"
+indexinfo[0].command[1].indexname "sddocname"
+indexinfo[0].command[1].command "word"
+indexinfo[0].command[2].indexname "abyte"
+indexinfo[0].command[2].command "index"
+indexinfo[0].command[3].indexname "abyte"
+indexinfo[0].command[3].command "attribute"
+indexinfo[0].command[4].indexname "abyte"
+indexinfo[0].command[4].command "numerical"
+indexinfo[0].command[5].indexname "along"
+indexinfo[0].command[5].command "index"
+indexinfo[0].command[6].indexname "along"
+indexinfo[0].command[6].command "attribute"
+indexinfo[0].command[7].indexname "along"
+indexinfo[0].command[7].command "numerical"
+indexinfo[0].command[8].indexname "arrayfield"
+indexinfo[0].command[8].command "index"
+indexinfo[0].command[9].indexname "arrayfield"
+indexinfo[0].command[9].command "multivalue"
+indexinfo[0].command[10].indexname "arrayfield"
+indexinfo[0].command[10].command "attribute"
+indexinfo[0].command[11].indexname "setfield"
+indexinfo[0].command[11].command "index"
+indexinfo[0].command[12].indexname "setfield"
+indexinfo[0].command[12].command "multivalue"
+indexinfo[0].command[13].indexname "setfield"
+indexinfo[0].command[13].command "attribute"
+indexinfo[0].command[14].indexname "setfield2"
+indexinfo[0].command[14].command "index"
+indexinfo[0].command[15].indexname "setfield2"
+indexinfo[0].command[15].command "multivalue"
+indexinfo[0].command[16].indexname "setfield2"
+indexinfo[0].command[16].command "attribute"
+indexinfo[0].command[17].indexname "setfield2"
+indexinfo[0].command[17].command "word"
+indexinfo[0].command[18].indexname "setfield3"
+indexinfo[0].command[18].command "index"
+indexinfo[0].command[19].indexname "setfield3"
+indexinfo[0].command[19].command "multivalue"
+indexinfo[0].command[20].indexname "setfield3"
+indexinfo[0].command[20].command "attribute"
+indexinfo[0].command[21].indexname "setfield4"
+indexinfo[0].command[21].command "index"
+indexinfo[0].command[22].indexname "setfield4"
+indexinfo[0].command[22].command "multivalue"
+indexinfo[0].command[23].indexname "setfield4"
+indexinfo[0].command[23].command "attribute"
+indexinfo[0].command[24].indexname "tagfield"
+indexinfo[0].command[24].command "index"
+indexinfo[0].command[25].indexname "tagfield"
+indexinfo[0].command[25].command "multivalue"
+indexinfo[0].command[26].indexname "tagfield"
+indexinfo[0].command[26].command "attribute"
+indexinfo[0].command[27].indexname "structfield.s1"
+indexinfo[0].command[27].command "index"
+indexinfo[0].command[28].indexname "structfield.s2"
+indexinfo[0].command[28].command "index"
+indexinfo[0].command[29].indexname "structfield"
+indexinfo[0].command[29].command "index"
+indexinfo[0].command[30].indexname "structarrayfield.s1"
+indexinfo[0].command[30].command "index"
+indexinfo[0].command[31].indexname "structarrayfield.s2"
+indexinfo[0].command[31].command "index"
+indexinfo[0].command[32].indexname "structarrayfield"
+indexinfo[0].command[32].command "index"
+indexinfo[0].command[33].indexname "structarrayfield"
+indexinfo[0].command[33].command "multivalue"
+indexinfo[0].command[34].indexname "stringmapfield.key"
+indexinfo[0].command[34].command "index"
+indexinfo[0].command[35].indexname "stringmapfield.key"
+indexinfo[0].command[35].command "lowercase"
+indexinfo[0].command[36].indexname "stringmapfield.key"
+indexinfo[0].command[36].command "stem:SHORTEST"
+indexinfo[0].command[37].indexname "stringmapfield.key"
+indexinfo[0].command[37].command "normalize"
+indexinfo[0].command[38].indexname "stringmapfield.value"
+indexinfo[0].command[38].command "index"
+indexinfo[0].command[39].indexname "stringmapfield.value"
+indexinfo[0].command[39].command "lowercase"
+indexinfo[0].command[40].indexname "stringmapfield.value"
+indexinfo[0].command[40].command "stem:SHORTEST"
+indexinfo[0].command[41].indexname "stringmapfield.value"
+indexinfo[0].command[41].command "normalize"
+indexinfo[0].command[42].indexname "stringmapfield"
+indexinfo[0].command[42].command "index"
+indexinfo[0].command[43].indexname "stringmapfield"
+indexinfo[0].command[43].command "lowercase"
+indexinfo[0].command[44].indexname "stringmapfield"
+indexinfo[0].command[44].command "multivalue"
+indexinfo[0].command[45].indexname "intmapfield.key"
+indexinfo[0].command[45].command "index"
+indexinfo[0].command[46].indexname "intmapfield.value"
+indexinfo[0].command[46].command "index"
+indexinfo[0].command[47].indexname "intmapfield.value"
+indexinfo[0].command[47].command "numerical"
+indexinfo[0].command[48].indexname "intmapfield"
+indexinfo[0].command[48].command "index"
+indexinfo[0].command[49].indexname "intmapfield"
+indexinfo[0].command[49].command "multivalue"
+indexinfo[0].command[50].indexname "floatmapfield.key"
+indexinfo[0].command[50].command "index"
+indexinfo[0].command[51].indexname "floatmapfield.value"
+indexinfo[0].command[51].command "index"
+indexinfo[0].command[52].indexname "floatmapfield.value"
+indexinfo[0].command[52].command "numerical"
+indexinfo[0].command[53].indexname "floatmapfield"
+indexinfo[0].command[53].command "index"
+indexinfo[0].command[54].indexname "floatmapfield"
+indexinfo[0].command[54].command "multivalue"
+indexinfo[0].command[55].indexname "longmapfield.key"
+indexinfo[0].command[55].command "index"
+indexinfo[0].command[56].indexname "longmapfield.key"
+indexinfo[0].command[56].command "numerical"
+indexinfo[0].command[57].indexname "longmapfield.value"
+indexinfo[0].command[57].command "index"
+indexinfo[0].command[58].indexname "longmapfield.value"
+indexinfo[0].command[58].command "numerical"
+indexinfo[0].command[59].indexname "longmapfield"
+indexinfo[0].command[59].command "index"
+indexinfo[0].command[60].indexname "longmapfield"
+indexinfo[0].command[60].command "multivalue"
+indexinfo[0].command[61].indexname "doublemapfield.key"
+indexinfo[0].command[61].command "index"
+indexinfo[0].command[62].indexname "doublemapfield.key"
+indexinfo[0].command[62].command "numerical"
+indexinfo[0].command[63].indexname "doublemapfield.value"
+indexinfo[0].command[63].command "index"
+indexinfo[0].command[64].indexname "doublemapfield.value"
+indexinfo[0].command[64].command "numerical"
+indexinfo[0].command[65].indexname "doublemapfield"
+indexinfo[0].command[65].command "index"
+indexinfo[0].command[66].indexname "doublemapfield"
+indexinfo[0].command[66].command "multivalue"
+indexinfo[0].command[67].indexname "arraymapfield.key"
+indexinfo[0].command[67].command "index"
+indexinfo[0].command[68].indexname "arraymapfield.value"
+indexinfo[0].command[68].command "index"
+indexinfo[0].command[69].indexname "arraymapfield.value"
+indexinfo[0].command[69].command "multivalue"
+indexinfo[0].command[70].indexname "arraymapfield"
+indexinfo[0].command[70].command "index"
+indexinfo[0].command[71].indexname "arraymapfield"
+indexinfo[0].command[71].command "multivalue"
+indexinfo[0].command[72].indexname "arrarr"
+indexinfo[0].command[72].command "index"
+indexinfo[0].command[73].indexname "arrarr"
+indexinfo[0].command[73].command "multivalue"
+indexinfo[0].command[74].indexname "maparr"
+indexinfo[0].command[74].command "index"
+indexinfo[0].command[75].indexname "maparr"
+indexinfo[0].command[75].command "multivalue"
+indexinfo[0].command[76].indexname "mystructfield.bytearr"
+indexinfo[0].command[76].command "index"
+indexinfo[0].command[77].indexname "mystructfield.bytearr"
+indexinfo[0].command[77].command "multivalue"
+indexinfo[0].command[78].indexname "mystructfield.mymap.key"
+indexinfo[0].command[78].command "index"
+indexinfo[0].command[79].indexname "mystructfield.mymap.value"
+indexinfo[0].command[79].command "index"
+indexinfo[0].command[80].indexname "mystructfield.mymap"
+indexinfo[0].command[80].command "index"
+indexinfo[0].command[81].indexname "mystructfield.mymap"
+indexinfo[0].command[81].command "multivalue"
+indexinfo[0].command[82].indexname "mystructfield.title"
+indexinfo[0].command[82].command "index"
+indexinfo[0].command[83].indexname "mystructfield.structfield"
+indexinfo[0].command[83].command "index"
+indexinfo[0].command[84].indexname "mystructfield"
+indexinfo[0].command[84].command "index"
+indexinfo[0].command[85].indexname "mystructmap.key"
+indexinfo[0].command[85].command "index"
+indexinfo[0].command[86].indexname "mystructmap.key"
+indexinfo[0].command[86].command "numerical"
+indexinfo[0].command[87].indexname "mystructmap.value.bytearr"
+indexinfo[0].command[87].command "index"
+indexinfo[0].command[88].indexname "mystructmap.value.bytearr"
+indexinfo[0].command[88].command "multivalue"
+indexinfo[0].command[89].indexname "mystructmap.value.mymap.key"
+indexinfo[0].command[89].command "index"
+indexinfo[0].command[90].indexname "mystructmap.value.mymap.value"
+indexinfo[0].command[90].command "index"
+indexinfo[0].command[91].indexname "mystructmap.value.mymap"
+indexinfo[0].command[91].command "index"
+indexinfo[0].command[92].indexname "mystructmap.value.mymap"
+indexinfo[0].command[92].command "multivalue"
+indexinfo[0].command[93].indexname "mystructmap.value.title"
+indexinfo[0].command[93].command "index"
+indexinfo[0].command[94].indexname "mystructmap.value.structfield"
+indexinfo[0].command[94].command "index"
+indexinfo[0].command[95].indexname "mystructmap.value"
+indexinfo[0].command[95].command "index"
+indexinfo[0].command[96].indexname "mystructmap"
+indexinfo[0].command[96].command "index"
+indexinfo[0].command[97].indexname "mystructmap"
+indexinfo[0].command[97].command "multivalue"
+indexinfo[0].command[98].indexname "mystructarr.bytearr"
+indexinfo[0].command[98].command "index"
+indexinfo[0].command[99].indexname "mystructarr.bytearr"
+indexinfo[0].command[99].command "multivalue"
+indexinfo[0].command[100].indexname "mystructarr.mymap.key"
+indexinfo[0].command[100].command "index"
+indexinfo[0].command[101].indexname "mystructarr.mymap.value"
+indexinfo[0].command[101].command "index"
+indexinfo[0].command[102].indexname "mystructarr.mymap"
+indexinfo[0].command[102].command "index"
+indexinfo[0].command[103].indexname "mystructarr.mymap"
+indexinfo[0].command[103].command "multivalue"
+indexinfo[0].command[104].indexname "mystructarr.title"
+indexinfo[0].command[104].command "index"
+indexinfo[0].command[105].indexname "mystructarr.structfield"
+indexinfo[0].command[105].command "index"
+indexinfo[0].command[106].indexname "mystructarr"
+indexinfo[0].command[106].command "index"
+indexinfo[0].command[107].indexname "mystructarr"
+indexinfo[0].command[107].command "multivalue"
+indexinfo[0].command[108].indexname "Folders.key"
+indexinfo[0].command[108].command "index"
+indexinfo[0].command[109].indexname "Folders.key"
+indexinfo[0].command[109].command "numerical"
+indexinfo[0].command[110].indexname "Folders.value.Version"
+indexinfo[0].command[110].command "index"
+indexinfo[0].command[111].indexname "Folders.value.Version"
+indexinfo[0].command[111].command "numerical"
+indexinfo[0].command[112].indexname "Folders.value.Name"
+indexinfo[0].command[112].command "index"
+indexinfo[0].command[113].indexname "Folders.value.FlagsCounter.key"
+indexinfo[0].command[113].command "index"
+indexinfo[0].command[114].indexname "Folders.value.FlagsCounter.value"
+indexinfo[0].command[114].command "index"
+indexinfo[0].command[115].indexname "Folders.value.FlagsCounter.value"
+indexinfo[0].command[115].command "numerical"
+indexinfo[0].command[116].indexname "Folders.value.FlagsCounter"
+indexinfo[0].command[116].command "index"
+indexinfo[0].command[117].indexname "Folders.value.FlagsCounter"
+indexinfo[0].command[117].command "multivalue"
+indexinfo[0].command[118].indexname "Folders.value.anotherfolder.Version"
+indexinfo[0].command[118].command "index"
+indexinfo[0].command[119].indexname "Folders.value.anotherfolder.Version"
+indexinfo[0].command[119].command "numerical"
+indexinfo[0].command[120].indexname "Folders.value.anotherfolder.Name"
+indexinfo[0].command[120].command "index"
+indexinfo[0].command[121].indexname "Folders.value.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[121].command "index"
+indexinfo[0].command[122].indexname "Folders.value.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[122].command "index"
+indexinfo[0].command[123].indexname "Folders.value.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[123].command "numerical"
+indexinfo[0].command[124].indexname "Folders.value.anotherfolder.FlagsCounter"
+indexinfo[0].command[124].command "index"
+indexinfo[0].command[125].indexname "Folders.value.anotherfolder.FlagsCounter"
+indexinfo[0].command[125].command "multivalue"
+indexinfo[0].command[126].indexname "Folders.value.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[126].command "index"
+indexinfo[0].command[127].indexname "Folders.value.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[127].command "numerical"
+indexinfo[0].command[128].indexname "Folders.value.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[128].command "index"
+indexinfo[0].command[129].indexname "Folders.value.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[129].command "index"
+indexinfo[0].command[130].indexname "Folders.value.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[130].command "index"
+indexinfo[0].command[131].indexname "Folders.value.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[131].command "numerical"
+indexinfo[0].command[132].indexname "Folders.value.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[132].command "index"
+indexinfo[0].command[133].indexname "Folders.value.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[133].command "multivalue"
+indexinfo[0].command[134].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[134].command "index"
+indexinfo[0].command[135].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[135].command "numerical"
+indexinfo[0].command[136].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[136].command "index"
+indexinfo[0].command[137].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[137].command "index"
+indexinfo[0].command[138].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[138].command "index"
+indexinfo[0].command[139].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[139].command "numerical"
+indexinfo[0].command[140].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[140].command "index"
+indexinfo[0].command[141].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[141].command "multivalue"
+indexinfo[0].command[142].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[142].command "index"
+indexinfo[0].command[143].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[143].command "numerical"
+indexinfo[0].command[144].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[144].command "index"
+indexinfo[0].command[145].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[145].command "index"
+indexinfo[0].command[146].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[146].command "index"
+indexinfo[0].command[147].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[147].command "numerical"
+indexinfo[0].command[148].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[148].command "index"
+indexinfo[0].command[149].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[149].command "multivalue"
+indexinfo[0].command[150].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[150].command "index"
+indexinfo[0].command[151].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[151].command "numerical"
+indexinfo[0].command[152].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[152].command "index"
+indexinfo[0].command[153].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[153].command "index"
+indexinfo[0].command[154].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[154].command "index"
+indexinfo[0].command[155].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[155].command "numerical"
+indexinfo[0].command[156].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[156].command "index"
+indexinfo[0].command[157].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[157].command "multivalue"
+indexinfo[0].command[158].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[158].command "index"
+indexinfo[0].command[159].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[159].command "numerical"
+indexinfo[0].command[160].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[160].command "index"
+indexinfo[0].command[161].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[161].command "index"
+indexinfo[0].command[162].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[162].command "index"
+indexinfo[0].command[163].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[163].command "numerical"
+indexinfo[0].command[164].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[164].command "index"
+indexinfo[0].command[165].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[165].command "multivalue"
+indexinfo[0].command[166].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[166].command "index"
+indexinfo[0].command[167].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[167].command "numerical"
+indexinfo[0].command[168].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[168].command "index"
+indexinfo[0].command[169].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[169].command "index"
+indexinfo[0].command[170].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[170].command "index"
+indexinfo[0].command[171].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[171].command "numerical"
+indexinfo[0].command[172].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[172].command "index"
+indexinfo[0].command[173].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[173].command "multivalue"
+indexinfo[0].command[174].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[174].command "index"
+indexinfo[0].command[175].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Version"
+indexinfo[0].command[175].command "numerical"
+indexinfo[0].command[176].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.Name"
+indexinfo[0].command[176].command "index"
+indexinfo[0].command[177].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.key"
+indexinfo[0].command[177].command "index"
+indexinfo[0].command[178].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[178].command "index"
+indexinfo[0].command[179].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter.value"
+indexinfo[0].command[179].command "numerical"
+indexinfo[0].command[180].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[180].command "index"
+indexinfo[0].command[181].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.FlagsCounter"
+indexinfo[0].command[181].command "multivalue"
+indexinfo[0].command[182].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[182].command "index"
+indexinfo[0].command[183].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[183].command "index"
+indexinfo[0].command[184].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[184].command "index"
+indexinfo[0].command[185].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[185].command "index"
+indexinfo[0].command[186].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[186].command "index"
+indexinfo[0].command[187].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[187].command "index"
+indexinfo[0].command[188].indexname "Folders.value.anotherfolder.anotherfolder.anotherfolder"
+indexinfo[0].command[188].command "index"
+indexinfo[0].command[189].indexname "Folders.value.anotherfolder.anotherfolder"
+indexinfo[0].command[189].command "index"
+indexinfo[0].command[190].indexname "Folders.value.anotherfolder"
+indexinfo[0].command[190].command "index"
+indexinfo[0].command[191].indexname "Folders.value"
+indexinfo[0].command[191].command "index"
+indexinfo[0].command[192].indexname "Folders"
+indexinfo[0].command[192].command "index"
+indexinfo[0].command[193].indexname "Folders"
+indexinfo[0].command[193].command "multivalue"
+indexinfo[0].command[194].indexname "juletre"
+indexinfo[0].command[194].command "index"
+indexinfo[0].command[195].indexname "juletre"
+indexinfo[0].command[195].command "attribute"
+indexinfo[0].command[196].indexname "juletre"
+indexinfo[0].command[196].command "fast-search"
+indexinfo[0].command[197].indexname "juletre"
+indexinfo[0].command[197].command "numerical"
+indexinfo[0].command[198].indexname "album0"
+indexinfo[0].command[198].command "index"
+indexinfo[0].command[199].indexname "album0"
+indexinfo[0].command[199].command "multivalue"
+indexinfo[0].command[200].indexname "album1"
+indexinfo[0].command[200].command "index"
+indexinfo[0].command[201].indexname "album1"
+indexinfo[0].command[201].command "multivalue"
+indexinfo[0].command[202].indexname "album1"
+indexinfo[0].command[202].command "attribute"
+indexinfo[0].command[203].indexname "album1"
+indexinfo[0].command[203].command "word"
+indexinfo[0].command[204].indexname "complexarray"
+indexinfo[0].command[204].command "index"
+indexinfo[0].command[205].indexname "complexarray"
+indexinfo[0].command[205].command "multivalue"
+indexinfo[0].command[206].indexname "other"
+indexinfo[0].command[206].command "index"
+indexinfo[0].command[207].indexname "other"
+indexinfo[0].command[207].command "attribute"
+indexinfo[0].command[208].indexname "other"
+indexinfo[0].command[208].command "numerical"
+indexinfo[0].command[209].indexname "pst_sta_boldingoff_nomatch_tag_01"
+indexinfo[0].command[209].command "index"
+indexinfo[0].command[210].indexname "pst_sta_boldingoff_nomatch_tag_01"
+indexinfo[0].command[210].command "multivalue"
+indexinfo[0].command[211].indexname "rankfeatures"
+indexinfo[0].command[211].command "index"
+indexinfo[0].command[212].indexname "summaryfeatures"
+indexinfo[0].command[212].command "index"
diff --git a/config-model/src/test/derived/types/rank-profiles.cfg b/config-model/src/test/derived/types/rank-profiles.cfg
new file mode 100644
index 00000000000..342a3ca0a2e
--- /dev/null
+++ b/config-model/src/test/derived/types/rank-profiles.cfg
@@ -0,0 +1,16 @@
+rankprofile[0].name "default"
+rankprofile[0].fef.property[0].name "nativeAttributeMatch.weightTable.setfield2"
+rankprofile[0].fef.property[0].value "linear(0,0)"
+rankprofile[0].fef.property[1].name "nativeAttributeMatch.weightTable.setfield3"
+rankprofile[0].fef.property[1].value "linear(0,0)"
+rankprofile[0].fef.property[2].name "nativeAttributeMatch.weightTable.tagfield"
+rankprofile[0].fef.property[2].value "loggrowth(38,50,1)"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true" \ No newline at end of file
diff --git a/config-model/src/test/derived/types/summary.0.cfg.part.types1125507321 b/config-model/src/test/derived/types/summary.0.cfg.part.types1125507321
new file mode 100644
index 00000000000..a0a6ea62b39
--- /dev/null
+++ b/config-model/src/test/derived/types/summary.0.cfg.part.types1125507321
@@ -0,0 +1,9 @@
+classes[types1125507321].id 1125507321
+classes[types1125507321].name types
+classes[types1125507321].fields[3]
+classes[types1125507321].fields[0].name sddocname
+classes[types1125507321].fields[0].type string
+classes[types1125507321].fields[1].name abyte
+classes[types1125507321].fields[1].type byte
+classes[types1125507321].fields[2].name ranklog
+classes[types1125507321].fields[2].type string
diff --git a/config-model/src/test/derived/types/summary.cfg b/config-model/src/test/derived/types/summary.cfg
new file mode 100644
index 00000000000..6a62dedb851
--- /dev/null
+++ b/config-model/src/test/derived/types/summary.cfg
@@ -0,0 +1,35 @@
+defaultsummaryid 1103008471
+classes[0].id 1103008471
+classes[0].name "default"
+classes[0].fields[0].name "abyte"
+classes[0].fields[0].type "byte"
+classes[0].fields[1].name "along"
+classes[0].fields[1].type "int64"
+classes[0].fields[2].name "tagfield"
+classes[0].fields[2].type "jsonstring"
+classes[0].fields[3].name "stringmapfield"
+classes[0].fields[3].type "jsonstring"
+classes[0].fields[4].name "album0"
+classes[0].fields[4].type "jsonstring"
+classes[0].fields[5].name "album1"
+classes[0].fields[5].type "jsonstring"
+classes[0].fields[6].name "rankfeatures"
+classes[0].fields[6].type "featuredata"
+classes[0].fields[7].name "summaryfeatures"
+classes[0].fields[7].type "featuredata"
+classes[0].fields[8].name "documentid"
+classes[0].fields[8].type "longstring"
+classes[1].id 278794929
+classes[1].name "attributeprefetch"
+classes[1].fields[0].name "other"
+classes[1].fields[0].type "int64"
+classes[1].fields[1].name "abyte"
+classes[1].fields[1].type "byte"
+classes[1].fields[2].name "along"
+classes[1].fields[2].type "int64"
+classes[1].fields[3].name "juletre"
+classes[1].fields[3].type "int64"
+classes[1].fields[4].name "rankfeatures"
+classes[1].fields[4].type "featuredata"
+classes[1].fields[5].name "summaryfeatures"
+classes[1].fields[5].type "featuredata"
diff --git a/config-model/src/test/derived/types/summarymap.cfg b/config-model/src/test/derived/types/summarymap.cfg
new file mode 100644
index 00000000000..eac532d966b
--- /dev/null
+++ b/config-model/src/test/derived/types/summarymap.cfg
@@ -0,0 +1,25 @@
+defaultoutputclass -1
+override[0].field "abyte"
+override[0].command "attribute"
+override[0].arguments "abyte"
+override[1].field "along"
+override[1].command "attribute"
+override[1].arguments "along"
+override[2].field "tagfield"
+override[2].command "attribute"
+override[2].arguments "tagfield"
+override[3].field "album1"
+override[3].command "attribute"
+override[3].arguments "album1"
+override[4].field "rankfeatures"
+override[4].command "rankfeatures"
+override[4].arguments ""
+override[5].field "summaryfeatures"
+override[5].command "summaryfeatures"
+override[5].arguments ""
+override[6].field "other"
+override[6].command "attribute"
+override[6].arguments "other"
+override[7].field "juletre"
+override[7].command "attribute"
+override[7].arguments "juletre"
diff --git a/config-model/src/test/derived/types/types.sd b/config-model/src/test/derived/types/types.sd
new file mode 100644
index 00000000000..69101934461
--- /dev/null
+++ b/config-model/src/test/derived/types/types.sd
@@ -0,0 +1,150 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search types {
+
+ document types {
+
+ field abyte type byte {
+ indexing: index | summary | attribute
+ }
+
+ field along type long {
+ indexing: index | summary | attribute
+ }
+
+ field arrayfield type array<int> {
+ indexing: attribute
+ }
+
+ field setfield type weightedset<string> {
+ indexing: attribute
+ match {
+ token
+ }
+ }
+
+ field setfield2 type weightedset<string> {
+ indexing: attribute
+ weightedset: remove-if-zero
+ weightedset: create-if-nonexistent
+ rank-type: empty
+ }
+
+ field setfield3 type weightedset<string> {
+ weightedset: remove-if-zero
+ indexing: attribute
+ rank-type: empty
+ match {
+ token
+ }
+ }
+
+ field setfield4 type weightedset<string> {
+ weightedset: create-if-nonexistent
+ indexing: attribute
+ match {
+ token
+ }
+ }
+
+ field tagfield type tag {
+ indexing: attribute | summary
+ match {
+ token
+ }
+ }
+ struct sct {
+ field s1 type string {}
+ field s2 type string {}
+ }
+ field structfield type sct {
+ }
+ field structarrayfield type array<sct> {
+ }
+ field stringmapfield type map<string, string> {
+ indexing: index | summary
+ }
+ field intmapfield type map<string, int> {
+
+ }
+ field floatmapfield type map<string, float> {
+
+ }
+ field longmapfield type map<int, long> {
+
+ }
+ field doublemapfield type map<int, double> {
+
+ }
+ field arraymapfield type map<string,array<int>> {
+
+ }
+ #field complexfield type map<array<sct>, map<int,array<float>>> {
+ #}
+ #field wildcardfield type map<int,?> {
+ #}
+ #field wildcardfield2 type map<?,?> {
+ #}
+
+ field arrarr type array<array<array<string>>> {header}
+ field maparr type array<map<string, string>> {header}
+ field complexarray type array< map<array<array<string>>, int> > {body}
+
+ struct mystruct {
+ field bytearr type array<byte>{}
+ field mymap type map<string, string>{}
+ field title type string {}
+ field structfield type string {}
+ }
+
+ field mystructfield type mystruct {header}
+ field mystructmap type map<int, mystruct> {header}
+ field mystructarr type array<mystruct> {header}
+
+ struct folder {
+ field Version type int {}
+ field Name type string {}
+ field FlagsCounter type map<string,long> {}
+ field anotherfolder type folder {}
+ }
+
+
+ field Folders type map<int,folder> {}
+
+ field juletre type long {
+ indexing: attribute
+ attribute {
+ fast-search
+ }
+ }
+
+ # Field defined same way as tag
+ field album0 type weightedset<string> {
+ indexing: summary
+ # This is pointless, but
+ weightedset {
+ create-if-nonexistent
+ remove-if-zero
+ }
+ header
+ }
+
+ # Field defined same way as tag
+ field album1 type weightedset<string> {
+ indexing: attribute | summary
+ weightedset {
+ create-if-nonexistent
+ remove-if-zero
+ }
+ header
+ }
+
+ }
+
+ field pst_sta_boldingoff_nomatch_tag_01 type tag {
+ body
+ }
+
+ field other type long {
+ indexing: input along | attribute
+ }
+}
diff --git a/config-model/src/test/derived/types/vsmsummary.cfg b/config-model/src/test/derived/types/vsmsummary.cfg
new file mode 100644
index 00000000000..6c641d9935e
--- /dev/null
+++ b/config-model/src/test/derived/types/vsmsummary.cfg
@@ -0,0 +1,23 @@
+outputclass ""
+fieldmap[0].summary "abyte"
+fieldmap[0].document[0].field "abyte"
+fieldmap[0].command NONE
+fieldmap[1].summary "along"
+fieldmap[1].document[0].field "along"
+fieldmap[1].command NONE
+fieldmap[2].summary "tagfield"
+fieldmap[2].document[0].field "tagfield"
+fieldmap[2].command NONE
+fieldmap[3].summary "stringmapfield"
+fieldmap[3].document[0].field "stringmapfield"
+fieldmap[3].command NONE
+fieldmap[4].summary "album0"
+fieldmap[4].document[0].field "album0"
+fieldmap[4].command NONE
+fieldmap[5].summary "album1"
+fieldmap[5].document[0].field "album1"
+fieldmap[5].command NONE
+fieldmap[6].summary "rankfeatures"
+fieldmap[6].command NONE
+fieldmap[7].summary "summaryfeatures"
+fieldmap[7].command NONE \ No newline at end of file
diff --git a/config-model/src/test/derived/uri_array/ilscripts.cfg b/config-model/src/test/derived/uri_array/ilscripts.cfg
new file mode 100644
index 00000000000..de78b44199c
--- /dev/null
+++ b/config-model/src/test/derived/uri_array/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "uri_array"
+ilscript[0].docfield[0] "my_uri"
+ilscript[0].content[0] "clear_state | guard { input my_uri | index my_uri; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/uri_array/indexschema.cfg b/config-model/src/test/derived/uri_array/indexschema.cfg
new file mode 100644
index 00000000000..4e6875bffb8
--- /dev/null
+++ b/config-model/src/test/derived/uri_array/indexschema.cfg
@@ -0,0 +1,64 @@
+indexfield[0].name "my_uri"
+indexfield[0].indextype VESPA
+indexfield[0].datatype STRING
+indexfield[0].collectiontype ARRAY
+indexfield[0].prefix false
+indexfield[0].phrases false
+indexfield[0].positions true
+indexfield[0].averageelementlen 512
+indexfield[1].name "my_uri.fragment"
+indexfield[1].indextype VESPA
+indexfield[1].datatype STRING
+indexfield[1].collectiontype ARRAY
+indexfield[1].prefix false
+indexfield[1].phrases false
+indexfield[1].positions true
+indexfield[1].averageelementlen 512
+indexfield[2].name "my_uri.host"
+indexfield[2].indextype VESPA
+indexfield[2].datatype STRING
+indexfield[2].collectiontype ARRAY
+indexfield[2].prefix false
+indexfield[2].phrases false
+indexfield[2].positions true
+indexfield[2].averageelementlen 512
+indexfield[3].name "my_uri.hostname"
+indexfield[3].indextype VESPA
+indexfield[3].datatype STRING
+indexfield[3].collectiontype ARRAY
+indexfield[3].prefix false
+indexfield[3].phrases false
+indexfield[3].positions true
+indexfield[3].averageelementlen 512
+indexfield[4].name "my_uri.path"
+indexfield[4].indextype VESPA
+indexfield[4].datatype STRING
+indexfield[4].collectiontype ARRAY
+indexfield[4].prefix false
+indexfield[4].phrases false
+indexfield[4].positions true
+indexfield[4].averageelementlen 512
+indexfield[5].name "my_uri.port"
+indexfield[5].indextype VESPA
+indexfield[5].datatype STRING
+indexfield[5].collectiontype ARRAY
+indexfield[5].prefix false
+indexfield[5].phrases false
+indexfield[5].positions true
+indexfield[5].averageelementlen 512
+indexfield[6].name "my_uri.query"
+indexfield[6].indextype VESPA
+indexfield[6].datatype STRING
+indexfield[6].collectiontype ARRAY
+indexfield[6].prefix false
+indexfield[6].phrases false
+indexfield[6].positions true
+indexfield[6].averageelementlen 512
+indexfield[7].name "my_uri.scheme"
+indexfield[7].indextype VESPA
+indexfield[7].datatype STRING
+indexfield[7].collectiontype ARRAY
+indexfield[7].prefix false
+indexfield[7].phrases false
+indexfield[7].positions true
+indexfield[7].averageelementlen 512 \ No newline at end of file
diff --git a/config-model/src/test/derived/uri_array/uri_array.sd b/config-model/src/test/derived/uri_array/uri_array.sd
new file mode 100644
index 00000000000..d71ee231238
--- /dev/null
+++ b/config-model/src/test/derived/uri_array/uri_array.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search uri_array {
+ document uri_array {
+ field my_uri type array<uri> {
+ indexing: index
+ }
+ }
+}
diff --git a/config-model/src/test/derived/uri_wset/ilscripts.cfg b/config-model/src/test/derived/uri_wset/ilscripts.cfg
new file mode 100644
index 00000000000..81066cd130d
--- /dev/null
+++ b/config-model/src/test/derived/uri_wset/ilscripts.cfg
@@ -0,0 +1,4 @@
+maxtermoccurrences 100
+ilscript[0].doctype "uri_wset"
+ilscript[0].docfield[0] "my_uri"
+ilscript[0].content[0] "clear_state | guard { input my_uri | index my_uri; }" \ No newline at end of file
diff --git a/config-model/src/test/derived/uri_wset/indexschema.cfg b/config-model/src/test/derived/uri_wset/indexschema.cfg
new file mode 100644
index 00000000000..0a750704933
--- /dev/null
+++ b/config-model/src/test/derived/uri_wset/indexschema.cfg
@@ -0,0 +1,64 @@
+indexfield[0].name "my_uri"
+indexfield[0].indextype VESPA
+indexfield[0].datatype STRING
+indexfield[0].collectiontype WEIGHTEDSET
+indexfield[0].prefix false
+indexfield[0].phrases false
+indexfield[0].positions true
+indexfield[0].averageelementlen 512
+indexfield[1].name "my_uri.fragment"
+indexfield[1].indextype VESPA
+indexfield[1].datatype STRING
+indexfield[1].collectiontype WEIGHTEDSET
+indexfield[1].prefix false
+indexfield[1].phrases false
+indexfield[1].positions true
+indexfield[1].averageelementlen 512
+indexfield[2].name "my_uri.host"
+indexfield[2].indextype VESPA
+indexfield[2].datatype STRING
+indexfield[2].collectiontype WEIGHTEDSET
+indexfield[2].prefix false
+indexfield[2].phrases false
+indexfield[2].positions true
+indexfield[2].averageelementlen 512
+indexfield[3].name "my_uri.hostname"
+indexfield[3].indextype VESPA
+indexfield[3].datatype STRING
+indexfield[3].collectiontype WEIGHTEDSET
+indexfield[3].prefix false
+indexfield[3].phrases false
+indexfield[3].positions true
+indexfield[3].averageelementlen 512
+indexfield[4].name "my_uri.path"
+indexfield[4].indextype VESPA
+indexfield[4].datatype STRING
+indexfield[4].collectiontype WEIGHTEDSET
+indexfield[4].prefix false
+indexfield[4].phrases false
+indexfield[4].positions true
+indexfield[4].averageelementlen 512
+indexfield[5].name "my_uri.port"
+indexfield[5].indextype VESPA
+indexfield[5].datatype STRING
+indexfield[5].collectiontype WEIGHTEDSET
+indexfield[5].prefix false
+indexfield[5].phrases false
+indexfield[5].positions true
+indexfield[5].averageelementlen 512
+indexfield[6].name "my_uri.query"
+indexfield[6].indextype VESPA
+indexfield[6].datatype STRING
+indexfield[6].collectiontype WEIGHTEDSET
+indexfield[6].prefix false
+indexfield[6].phrases false
+indexfield[6].positions true
+indexfield[6].averageelementlen 512
+indexfield[7].name "my_uri.scheme"
+indexfield[7].indextype VESPA
+indexfield[7].datatype STRING
+indexfield[7].collectiontype WEIGHTEDSET
+indexfield[7].prefix false
+indexfield[7].phrases false
+indexfield[7].positions true
+indexfield[7].averageelementlen 512 \ No newline at end of file
diff --git a/config-model/src/test/derived/uri_wset/uri_wset.sd b/config-model/src/test/derived/uri_wset/uri_wset.sd
new file mode 100644
index 00000000000..547ec7dc728
--- /dev/null
+++ b/config-model/src/test/derived/uri_wset/uri_wset.sd
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+search uri_wset {
+ document uri_wset {
+ field my_uri type weightedset<uri> {
+ indexing: index
+ }
+ }
+}