public static Change add(final CourseRec course, final OffRec offering) {
		offering.setCourse(course);
		Change change = new Change(course.getSource(), Change.ADD, offering) {
			@Override
			public String getDescription() {
				return "Offering";
			}

			@Override
			public Object getTarget() {
				return "[" + course.getStatus() + "]" + course.getName();
			}

			@Override
			public Object getNewValue() {
				return offering.getStartStr();
			}

			@Override
			public Object getOldValue() {
				return null;
			}

			@Override
			public void apply(CourseModel model) {
				// Does class already have a MAYBE or REGISTERED offering?
				boolean alreadyHas = false;
				for (OffRec or : course.getOfferings()) {
					if (or.getStatus() == Status.MAYBE
							|| or.getStatus() == Status.REGISTERED) {
						alreadyHas = true;
						break;
					}
				}
				// Add first to avoid exception in setStatus.
				course.addOffering(offering);
				Status sc = course.getStatus();
				if (alreadyHas || sc == Status.NO || sc == Status.DONE
						|| sc == Status.AUDITED || sc == Status.CHAIN)
					offering.setStatus(Status.NO);
			}
		};
		StringBuffer b = new StringBuffer("<html><b>New offerring");
		if (offering.getStart() != null)
			b.append(" on ").append(OffRec.dformat.format(offering.getStart()));
		b.append("<br/>for ");
		appendCourse(b, course);
		return change.setOrder(3).setToolTop(b.toString());
	}