Buggy code:
public class CreateInterfaceJob extends AProjectJob < CreateInterfaceJob . Arguments > { public static class Arguments extends JobArguments { private final FeatureModel featuremodel ; private final Collection < String > featureNames ; private final String projectName ; public Arguments ( String projectName , FeatureModel featuremodel , Collection < String > featureNames ) { } } private FeatureModel newInterfaceModel = null ; protected CreateInterfaceJob ( CreateInterfaceJob . Arguments arguments ) { } public FeatureModel getInterfaceModel ( ) { } @ Override protected boolean work ( ) { } private FeatureModel createInterface ( FeatureModel orgFeatureModel , Collection < String > selectedFeatureNames ) throws TimeoutException { FeatureModel m = orgFeatureModel . deepClone ( false ) ; for ( Feature feat : m . getFeatures ( ) ) { feat . setAbstract ( ( ! ( selectedFeatureNames . contains ( feat . getName ( ) ) ) ) ) ; } workMonitor . setMaxAbsoluteWork ( 2 ) ; ArrayList < String > removeFeatures = new ArrayList ( m . getFeatureNames ( ) ) ; removeFeatures . removeAll ( selectedFeatureNames ) ; Node cnf = ( ( selectedFeatureNames . size ( ) ) > 1 ) ? CorePlugin . removeFeatures ( m , removeFeatures ) : new org . prop4j . Literal ( m . getRoot ( ) . getName ( ) ) ; workMonitor . worked ( ) ; m = orgFeatureModel . deepClone ( false ) ; for ( Feature feat : m . getFeatures ( ) ) { if ( ! ( selectedFeatureNames . contains ( feat . getName ( ) ) ) ) { feat . setName ( CreateInterfaceJob . MARK1 ) ; } } Feature root = m . getRoot ( ) ; m . setRoot ( null ) ; m . reset ( ) ; Feature nroot = new Feature ( m , "nroot" ) ; nroot . setAbstract ( true ) ; nroot . setAnd ( ) ; nroot . addChild ( root ) ; root . setParent ( nroot ) ; CreateInterfaceJob . cut ( nroot ) ; do { changed = false ; merge ( nroot , CreateInterfaceJob . GROUP_NO ) ; } while ( changed ) ; int count = 0 ; Hashtable < String , Feature > featureTable = new Hashtable < String , Feature > ( ) ; LinkedList < Feature > featureStack = new LinkedList < Feature > ( ) ; featureStack . push ( nroot ) ; while ( ! ( featureStack . isEmpty ( ) ) ) { Feature curFeature = featureStack . pop ( ) ; for ( Feature feature : curFeature . getChildren ( ) ) { featureStack . push ( feature ) ; } if ( curFeature . getName ( ) . startsWith ( CreateInterfaceJob . MARK1 ) ) { curFeature . setName ( ( ( ( root . getName ( ) ) + "_Abstract_" ) + ( count ++ ) ) ) ; curFeature . setAbstract ( true ) ; } featureTable . put ( curFeature . getName ( ) , curFeature ) ; } m . setFeatureTable ( featureTable ) ; m . setRoot ( nroot ) ; if ( cnf instanceof And ) { final Node [ ] children = cnf . getChildren ( ) ; workMonitor . setMaxAbsoluteWork ( ( ( children . length ) + 2 ) ) ; <START_BUG> final SatSolver modelSatSolver = new SatSolver ( new And ( NodeCreator . createNodes ( m ) , cnf . clone ( ) ) , 1000 ) ; <END_BUG> workMonitor . worked ( ) ; for ( int i = 0 ; i < ( children . length ) ; i ++ ) { final Node child = children [ i ] ; try { if ( checkOr ( modelSatSolver , child ) ) { m . addConstraint ( new de . ovgu . featureide . fm . core . Constraint ( m , child ) ) ; } } catch ( TimeoutException e ) { MPLPlugin . getDefault ( ) . logError ( e ) ; } finally { workMonitor . worked ( ) ; } } } return m ; } private boolean checkOr ( final SatSolver solver , Node clause ) throws TimeoutException { } private boolean checkLiteral ( final SatSolver solver , Node clause ) throws TimeoutException { } private static final String MARK1 = "?" ; private static final String MARK2 = "??" ; private static final int GROUP_OR = 1 ; private static final int GROUP_AND = 2 ; private static final int GROUP_ALT = 3 ; private static final int GROUP_NO = 0 ; private boolean changed = false ; private static int getGroup ( Feature f ) { } private void merge ( Feature curFeature , int parentGroup ) { } private void deleteFeature ( Feature curFeature ) { } private static boolean cut ( Feature curFeature ) { } }

Fix:
final SatSolver modelSatSolver = new SatSolver ( new And ( NodeCreator . createNodes ( m ) ) , 1000 ) ;