I got it working pretty quickly using your post as a guide. I've forgotten what the exception was from that I posted, d'oh, I was going to post it for future searches. It was something like passing the wrong class type in. Anyway, for anyone else who might read this: To use a custom JRDataSource in a sub-report including the implementations of JRDataSource provided such as JRMapCollectionDataSource you design your sub-report as normal. Under data source you specify "Custom data source" and delete all the stuff about factory classes etc. You then add the fields to the report that you are going to send in the data source. You need to add a parameter to the master report in iReport of type Object. When you add your sub-report you can look at the properties and tell it where to get the data-source. Tell it custom data source and then in the second text box type (for a JRMapCollectionDataSource): new JRMapCollectionDataSource(java.util.ArrayList(parameterObject)) The parameter you pass in must be a List (or Collection, sorry I can't remember because I don't have iReport on this computer but List definitely works) of Map instances. Now each instance of Map will have key-value pairs. The key is the field name in the sub-report and the value is the field value. If anyone is reading this and needs further advice please email me lionelv at gmail dot com Lionel.