diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..bf09b9ba0feb0f43b8002b79378912409118b724
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,88 @@
+# Project-specific
+# none (for now)
+
+# Mac file finder metadata
+.DS_Store
+# MS Office temporary file
+~*
+# Emacs backup file
+*~
+
+# Java files
+*.class
+javadoc/
+
+# JetBrains (IntelliJ IDEA, PyCharm, etc) files
+.idea/
+cmake-build-*/
+out/
+bin/
+*.iml
+*.iws
+*.ipr
+
+# Eclipse files
+bin/
+.settings/
+.classpath
+.project
+
+# Visual Studio / VS Code files
+.vs*/
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Netbeans files
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+# Xcode files
+*.xcodeproj/
+xcuserdata/
+.build/
+
+# Maven
+target/
+
+# Miscellaneous
+tmp/
+*.tmp
+*.bak
+*.bk
+*.swp
+*.gcno
diff --git a/assignment/class_diagram.md b/assignment/class_diagram.md
new file mode 100644
index 0000000000000000000000000000000000000000..160f04fc7dcc6a0deafd9dde32e81b3b6f9415ca
--- /dev/null
+++ b/assignment/class_diagram.md
@@ -0,0 +1,175 @@
+# Class Diagram
+
+Due: January 24, 2020 at 9:30am
+
+## Overview
+
+In this assignment you will prepare a simple class diagram.
+
+You will:
+
+-   Prepare a simple class diagram
+-   Practice domain modeling under guidance
+-   Demonstrate UML notation to show relationships between classes.
+
+## Instructions
+
+This assignment is to be completed individually; **no collaboration is
+permitted**.
+
+You may draw the diagram using a tool, or you may hand-draw it. *You may
+**not** use a tool that generates UML diagrams from programming language code.*
+If we see hallmarks of auto-generated UML, we will ask you to show us the tool
+you used to prepare the diagrams. If you used a tool that auto-generates UML,
+you will receive a score of 0 for this assignment.
+
+### Setup
+
+1.  You will use your `csce361-homework` repository for this assignment.
+1.  You will need one of:
+    -   A tool with which to draw UML diagrams, such as <https://draw.io>, that
+        will let you save your diagram as a pdf file.
+    -   A way to scan a hand-drawn diagram and save it as a pdf file.
+
+### Assignment
+
+Imagine, if you will, that you're working for Husker Klunker Car Rental Company.
+The company previously used notecards to keep track of its inventory and a
+pocket calculator to prepare customers' bills. After a particularly unfortunate
+incident involving the notecards, a table fan, a jar of peanut butter, and the
+owner's cat, you've been tasked with automating the car rental process.
+
+Prepare a domain-level UML *class diagram* for the relationship between
+vehicles, customers, and similarly-related domain concepts. Because this is
+domain-level, you don't need to include details such as visibility modifiers or
+datatypes.  Because this is domain-level, you shouldn't include anything not
+present in the problem domain; in particular, you shouldn't include
+implementation details such as GUI frames and textboxes.
+
+1.  There are two types of `Customer`s, `IndividualCustomer`s and
+    `CorporateCustomer`s. All customers have a name and an address. Place
+    `name` and `address` attributes in the `Customer` base class. Show that the
+    `Customer` class is an abstract class. If you are hand-drawing your
+    diagram, leave room to later add operations to the class.
+    -   A `CorporateCustomer` also has a `billingAccountNumber` attribute and a
+        `negotiatedRate` attribute. If you are hand-drawing your diagram, leave
+        room to later add operations to the class.
+    -   An `IndividualCustomer` has a payment card. Create a `PaymentCard`
+        class. Use aggregation to show that an `IndividualCustomer` has-a
+        `PaymentCard`. You do not need to show any of `PaymentCard`'s
+        attributes or operations. You do not need to show multiplicity on the
+        aggregation relationship.
+
+1.  Husker Klunker charges the customer based on the *class* of the vehicle.
+    For example, it costs more to rent an SUV than a mid-sized car, and an
+    economy car costs less to rent than a compact car.
+    -   Create an abstract `VehicleClass` that has a `dailyPrice` attribute.
+    -   Create subclasses of `VehicleClass` for SUVs, mid-sized cars, compact
+        cars, and economy cars.
+
+1.  Husker Klunker organizes its inventory based on the *model* of the vehicle.
+    For example, employees can check to see how many Canyoneros are available
+    to be rented.
+    -   Create a `VehicleModel` class, and show that it can be described by its
+        name, manufacturer, style, number of doors, and transmission type.
+    -   Use a simple association to show that each `VehicleModel` is associated
+        with exactly one `VehicleClass`.
+
+1.  The inventory keeps track of *vehicles*.
+    -   Create a `Vehicle` class, ad show that a `Vehicle` knows its VIN
+        (Vehicle Identification Number), its license plate, and its color. If
+        you are hand-drawing your diagram, leave room to later add operations
+        to the class.
+    -   Add an association between `Vehicle` and `VehicleModel`.
+        -   Use directionality to show that a `Vehicle` "knows" about its
+            `VehicleModel`, but a `VehicleModel` doesn't "know" about its
+            `Vehicle`s.
+        -   Add a label to show that a `Vehicle` can refer to its associated
+            `VehicleModel` as its `model`.
+    -   Add an operation to `Vehicle` to query the status of the `Vehicle`.
+
+1.  A customer rents a vehicle.
+    -   Use associations to show that an `IndividualCustomer` rents at most one
+        `Vehicle`, and that a `CorporateCustomer` rents arbitrarily many
+        `Vehicle`s.
+    -   Add reasonably-named operations to `Customer` for selecting a
+        `Vehicle`, checking out a `Vehicle`, and returning a `Vehicle`.
+    -   Because each subclass handles checking out a `Vehicle` differently,
+        show that the check out operation is abstract in `Vehicle`, and add the
+        check out operation to the subclasses to show that they override the
+        operation.
+    -   Add an operation to `Vehicle` to query its price.
+
+1.  After you have completed your diagram, save it as a pdf file called
+    `07-class_diagram.pdf` in your local copy of your `csce361-homework`
+    repository.  Then upload (add/commit/push) to the server.
+
+
+### Deliverables
+
+For grading, we will pull updates to your `csce361-homework` repository after
+the assignment is due, and we will look for:
+
+-   `03-class_diagram.pdf` containing your class diagram.
+
+*It is your responsibility to ensure that your work is in the master branch of
+the **correct repository** and that we have the correct level of access to the
+repository at the **time the assignment is due**.  We will grade what we can
+retrieve from the repository at the time it is due.  Any work that is not in
+the correct repository, or that we cannot access, will not be graded.*
+
+## Rubric
+
+The assignment is worth **13 points**:
+
+-   **5.5 points** for including the eleven classes (0.5 per class).
+
+-   **3.0 points** for including the class members as described (0.5 for each
+    of: `Customer`, `IndividualCustomer`, `CorporateCustomer`, `Vehicle`,
+    `VehicleModel`, and `VehicleClass`.)
+    -   Deduct for missing members
+    -   Deduct for members in the wrong box
+    -   Comment upon attributes named with verbs or operations named with nouns
+    -   Comment upon providing type-signatures for operations without parameter
+        names
+
+-   **0.5 points** for showing that `Customer` and `VehicleClass` are abstract
+    classes, and that `Vehicle`'s checkout method is abstract (either with
+    *italics* or with {abstact}).
+
+-   **0.5 points** for showing inheritance between `Customer` and its
+    subclasses, `IndividualCustomer` & `CorporateCustomer`.
+    -   Correct notation at correct end
+
+-   **0.5 points** for showing inheritance between `VehicleClass` and its
+    subclasses.
+
+-   **0.5 points** for showing association between `Vehicle` and
+    `VehicleModel`.
+    -   Correct directionality arrow
+    -   Correct label
+
+-   **0.5 points** for showing association between `VehicleClass` and
+    `VehicleModel`.
+    -   No directionality
+    -   Correct multiplicity
+
+-   **0.5 points** for showing associations between `Vehicle` and the
+    subclasses of `Customer`.
+    -   Correct multiplicity for the `IndividualCustomer`-`Vehicle` association
+    -   Correct multiplicity for the `CorporateCustomer`-`Vehicle` association
+
+-   **0.5 points** for showing aggregation between `IndividualCustomer` and
+    `PaymentCard`
+    -   Correct notation at correct end
+
+-   **0.5 points** for not including anything else wrong (TA discretion).
+
+-   **0.5 points** for using a meaningful commit message when committing your
+    file.
+
+
+*If **at any time** your repository is public or has internal visibility then
+you will receive a 10% penalty. Further, if another student accesses your
+non-private repository and copies your solution then I will assume that you are
+complicit in their academic dishonesty.*