Modelling one irregular surface to fit against another I'm currently modelling a sofa.  Each seat has two cushions, a horizontal one for sitting on and a vertical one for back support.  Both have been deformed with sculpting and proportional editing to give them a used look.  

I want one cushion to sit on top of the other with the bottom of the upper cushion deformed to fit the contours of the cushions underneath. 
So far I've been achieving that by placing the two meshes so they intersect, then pulling up the individual vertices of the upper cushion using snap to face so that they follow the form of the lower cushion.  See included test render.  





This works, more or less (as you can see from the included test render there are a few places where the two meshes still interfere with each other and the line vanishes), but is annoying and slow, plus getting enough distance between planes to allow Freestyle to draw a line without them looking like there's a gap is a process of trial and error.  There has to be a better way of achieving the same effect.  Is there a way you can get Blender to deform one mesh so that it fits properly against another?  

I am aware that you can just push one mesh through the other, but I'm also using Freestyle on this project, and Freestyle apparently can't render lines where meshes intersect, so the two meshes have to sit flush to each other and not pass through each other or there will be no line in the final output.
Use the Shrinkwrap modifier with vertex groups. 
Select the cushion you want to deform add a shrink wrap modifier, in the target option select the second cushion, change the order of the modifier to make sure the shrinkwrap modifier is below the subsurf modifier, then in edit mode (for the first cushion) select the vertices thats touching the second cushion and add them to a vertex group(go to object data properties, select the plus sign under vertex group, rename the group if you want, then with the desired vertices selected in edit mode click on assign), deselect everything and click the select button under the vertex group option to make sure only the desired vertices are part of the vertex group, then in the shrinkwrap modifier, under the vertex group options select the vertex group you just created.
And you should be good. Just make sure not to move the second cushion cause it is using it as a reference, if you do the first cushion would get distorted.