OvernightIndexedSwap::OvernightIndexedSwap(
                    Type type,
                    Real nominal,
                    const Schedule& schedule,
                    Rate fixedRate,
                    const DayCounter& fixedDC,
                    const boost::shared_ptr<OvernightIndex>& overnightIndex,
                    Spread spread)
      : Swap(2), type_(type), nominal_(nominal),
        paymentFrequency_(schedule.tenor().frequency()),
        //schedule_(schedule),
        fixedRate_(fixedRate), fixedDC_(fixedDC),
        overnightIndex_(overnightIndex), spread_(spread) {

        if (fixedDC_==DayCounter())
            fixedDC_ = overnightIndex_->dayCounter();
        legs_[0] = FixedRateLeg(schedule)
            .withNotionals(nominal_)
            .withCouponRates(fixedRate_, fixedDC_);

        legs_[1] = OvernightLeg(schedule, overnightIndex_)
            .withNotionals(nominal_)
            .withSpreads(spread_);

        for (Size j=0; j<2; ++j) {
            for (Leg::iterator i = legs_[j].begin(); i!= legs_[j].end(); ++i)
                registerWith(*i);
        }

        switch (type_) {
          case Payer:
            payer_[0] = -1.0;
            payer_[1] = +1.0;
            break;
          case Receiver:
            payer_[0] = +1.0;
            payer_[1] = -1.0;
            break;
          default:
            QL_FAIL("Unknown overnight-swap type");
        }
    }
    void IBOROISBasisSwap::initialize() {
		
        legs_[0] = IborLeg(floatingSchedule_, iborIndex_)
            .withNotionals(nominals_)
			.withPaymentDayCounter(floatingDayCount_)
            .withPaymentAdjustment(paymentConvention_);

        legs_[1] = OvernightLeg(overnightSchedule_, overnightIndex_)
            .withNotionals(nominals_)
			.withPaymentDayCounter(overnightDayCount_)
			.withPaymentAdjustment(paymentConvention_)
            .withSpreads(spread_);
		if(arithmeticAveragedCoupon_) {
			boost::shared_ptr<FloatingRateCouponPricer> arithmeticPricer(
								new ArithmeticAveragedOvernightIndexedCouponPricer());
			for(Size i = 0; i < legs_[1].size(); i++) {
				boost::shared_ptr<OvernightIndexedCoupon> c =
					boost::dynamic_pointer_cast<OvernightIndexedCoupon> (legs_[1][i]);
				c->setPricer(arithmeticPricer);
			}
		}

        for (Size j=0; j<2; ++j) {
            for (Leg::iterator i = legs_[j].begin(); i!= legs_[j].end(); ++i)
                registerWith(*i);
        }

        switch (type_) {
          case Payer:
            payer_[0] = -1.0;
            payer_[1] = +1.0;
            break;
          case Receiver:
            payer_[0] = +1.0;
            payer_[1] = -1.0;
            break;
          default:
            QL_FAIL("Unknown overnight-basis-swap type");
        }
    }