diff --git a/assignment/backend.puml b/assignment/backend.puml
index a5e43fbb8ea1ab706fd67855356579122711fdae..0f6743bc7eaab3e560810f62626290cd4c30e5dd 100644
--- a/assignment/backend.puml
+++ b/assignment/backend.puml
@@ -26,6 +26,7 @@ abstract class CustomerEntity <<entity>> {
     + {static} MAXIMUM_CITY_LENGTH
     + {static} STATE_LENGTH
     + {static} ZIPCODE_LENGTH
+    ~ {static} getCustomerByName(String name)
     ~ boolean canRent()
 }
 class CorporateCustomerEntity <<entity>> {
@@ -67,6 +68,7 @@ interface Model {
     }
 
 class ModelEntity <<entity>> {
+    ~ {static} Set<Model> getModelsByClass(VehicleClass vehicleClass)
     + void removeCar(Car car)
 }
 
diff --git a/src/main/java/edu/unl/cse/csce361/car_rental/backend/Backend.java b/src/main/java/edu/unl/cse/csce361/car_rental/backend/Backend.java
index 570c42e28895009b4df48a55d7f73bd0a13892c1..bfe07fa9a3dd577cd5c20ad607c00216e805f0bf 100644
--- a/src/main/java/edu/unl/cse/csce361/car_rental/backend/Backend.java
+++ b/src/main/java/edu/unl/cse/csce361/car_rental/backend/Backend.java
@@ -1,25 +1,38 @@
 package edu.unl.cse.csce361.car_rental.backend;
 
-import java.util.Collection;
-
+import java.util.Set;
 
 /**
  * A façade for the Backend subsystem.
  */
 public class Backend {
 
-    private Inventory inventory;
+    private static Backend instance;
+
+    public static Backend getInstance() {
+        if (instance == null) {
+            instance = new Backend();
+        }
+        return instance;
+    }
 
     private Backend() {
         super();
-        inventory = new Inventory();
     }
-    
-    public Collection<Car> getCar(String modelName) {
-        return null;
+
+    public Customer getCustomer(String name) {
+        return CustomerEntity.getCustomerByName(name);
     }
 
-    public Collection<Model> getModels() {
-        return inventory.getModels();
+    public Set<Model> getModels(String vehicleClass) {
+        Set<Model> models;
+        try {
+            Model.VehicleClass vehicleClassEnum = Model.VehicleClass.valueOf(vehicleClass.toUpperCase());
+            models = ModelEntity.getModelsByClass(vehicleClassEnum);
+        } catch (IllegalArgumentException | NullPointerException exception) {
+            System.err.println("No such vehicle class: " + vehicleClass.toUpperCase() + ". " + exception.getMessage());
+            models = Set.of();
+        }
+        return models;
     }
 }
diff --git a/src/main/java/edu/unl/cse/csce361/car_rental/backend/CustomerEntity.java b/src/main/java/edu/unl/cse/csce361/car_rental/backend/CustomerEntity.java
index 0d9795a23a9f6757fe520def90bee11d81b3a7ce..3dd70c94b5ec0014521854df66f3e1163285c966 100644
--- a/src/main/java/edu/unl/cse/csce361/car_rental/backend/CustomerEntity.java
+++ b/src/main/java/edu/unl/cse/csce361/car_rental/backend/CustomerEntity.java
@@ -1,5 +1,7 @@
 package edu.unl.cse.csce361.car_rental.backend;
 
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
 import org.hibernate.annotations.NaturalId;
 
 import javax.persistence.CascadeType;
@@ -23,6 +25,29 @@ import java.util.Set;
 @Inheritance(strategy = InheritanceType.JOINED)
 public abstract class CustomerEntity implements Customer {
 
+    /* Database code */
+
+    /**
+     * Retrieves the customer that has the specified name, if such a customer exists.
+     * @param name The name of the customer
+     * @return The specified customer if it is present in the database; <code>null</code> otherwise
+     */
+    static Customer getCustomerByName(String name) {
+        Session session = HibernateUtil.getSession();
+        session.beginTransaction();
+        Customer customer = null;
+        try {
+            customer = session.bySimpleNaturalId(CustomerEntity.class).load(name);
+            session.getTransaction().commit();
+        } catch (HibernateException exception) {
+            System.err.println("Could not load Customer " + name + ". " + exception.getMessage());
+        }
+        return customer;
+    }
+
+
+    /* POJO code */
+
     /** The maximum length of each of the customer's name and two street address lines */
     public static final int MAXIMUM_LINE_LENGTH = 48;
     /** The maximum length of the city's name */
diff --git a/src/main/java/edu/unl/cse/csce361/car_rental/backend/DatabasePopulator.java b/src/main/java/edu/unl/cse/csce361/car_rental/backend/DatabasePopulator.java
index cf15b373fcef03152c8eeb0fe9b46a3861c35a85..df7e1eec38b24c83170e0505999ecdbc68f96035 100644
--- a/src/main/java/edu/unl/cse/csce361/car_rental/backend/DatabasePopulator.java
+++ b/src/main/java/edu/unl/cse/csce361/car_rental/backend/DatabasePopulator.java
@@ -14,7 +14,7 @@ import static edu.unl.cse.csce361.car_rental.backend.Model.VehicleClass.*;
 
 public class DatabasePopulator {
 
-    private static Set<Model> createModels() {
+    static Set<Model> createModels() {
         System.out.println("Creating car models...");
         return Set.of(
                 new ModelEntity("Triumph", "Stag", COMPACT, 2, MANUAL, GASOLINE, 19),
@@ -33,7 +33,7 @@ public class DatabasePopulator {
     }
 
     @SuppressWarnings("SpellCheckingInspection")
-    private static Set<Car> createCars() {
+    static Set<Car> createCars() {
         System.out.println("Creating cars...");
         return Set.of(
                 new CarEntity("Ranger", "Blue", "123 ABC", "1234567890ABCDEFG"),
@@ -60,7 +60,7 @@ public class DatabasePopulator {
         );
     }
 
-    private static Set<Customer> createCorporateCustomers() {
+    static Set<Customer> createCorporateCustomers() {
         System.out.println("Creating corporate customers...");
         return Set.of(
                 new CorporateCustomerEntity("Cornhusker Airlines", "123 Airport Avenue", "",
@@ -81,7 +81,7 @@ public class DatabasePopulator {
     }
 
     @SuppressWarnings("SpellCheckingInspection")
-    private static Set<Customer> createIndividualCustomers() {
+    static Set<Customer> createIndividualCustomers() {
         System.out.println("Creating individual customers...");
         return Set.of(
                 new IndividualCustomerEntity("Stu Dent", "Fawlty Tower", "Room SB32",
@@ -108,7 +108,7 @@ public class DatabasePopulator {
     }
 
     @SuppressWarnings("SpellCheckingInspection")
-    private static Set<RentalEntity> createRentals(Session session) {
+    static Set<RentalEntity> createRentals(Session session) {
         System.out.println("Creating rentals...");
         Car car;
         Customer customer;
diff --git a/src/main/java/edu/unl/cse/csce361/car_rental/backend/Inventory.java b/src/main/java/edu/unl/cse/csce361/car_rental/backend/Inventory.java
deleted file mode 100644
index 131c19e9245da37f024d55827ffb6cf74aa30305..0000000000000000000000000000000000000000
--- a/src/main/java/edu/unl/cse/csce361/car_rental/backend/Inventory.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package edu.unl.cse.csce361.car_rental.backend;
-
-import java.util.Collection;
-import java.util.Collections;
-
-public class Inventory {
-
-    private Collection<Car> cars;       // this representation will probably change
-    private Collection<Model> models;
-
-    public Collection<Model> getModels() {
-        return Collections.unmodifiableCollection(models);
-    }
-}
diff --git a/src/main/java/edu/unl/cse/csce361/car_rental/backend/ModelEntity.java b/src/main/java/edu/unl/cse/csce361/car_rental/backend/ModelEntity.java
index 3c4af8ab401de0c5fd3530fa5cf8b209a00db382..98692c621126557e96892596e59ff17bbf48cead 100644
--- a/src/main/java/edu/unl/cse/csce361/car_rental/backend/ModelEntity.java
+++ b/src/main/java/edu/unl/cse/csce361/car_rental/backend/ModelEntity.java
@@ -1,5 +1,6 @@
 package edu.unl.cse.csce361.car_rental.backend;
 
+import org.hibernate.Session;
 import org.hibernate.annotations.NaturalId;
 
 import javax.persistence.CascadeType;
@@ -10,6 +11,7 @@ import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -20,6 +22,25 @@ import java.util.Set;
 @Entity
 public class ModelEntity implements Model {
 
+    /* Database code */
+
+    /**
+     * Retrieves a collection of car models that are of the specified vehicle class.
+     *
+     * @param vehicleClass The vehicle class of interest
+     * @return A set of car models
+     */
+    static Set<Model> getModelsByClass(VehicleClass vehicleClass) {
+        Session session = HibernateUtil.getSession();
+        List<ModelEntity> models = session
+                .createQuery("from ModelEntity where classType=" + vehicleClass.ordinal(), ModelEntity.class)
+                .list();
+        return Set.copyOf(models);
+    }
+
+
+    /* POJO code */
+
     /**
      * The upper bound on the length of a model name
      */
diff --git a/src/test/java/edu/unl/cse/csce361/car_rental/backend/BackendTest.java b/src/test/java/edu/unl/cse/csce361/car_rental/backend/BackendTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5683dfa1b5dcb5948b90eba05956ae3742d6884b
--- /dev/null
+++ b/src/test/java/edu/unl/cse/csce361/car_rental/backend/BackendTest.java
@@ -0,0 +1,65 @@
+package edu.unl.cse.csce361.car_rental.backend;
+
+import org.hibernate.Session;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.*;
+
+public class BackendTest {
+
+    Backend backend;
+
+    @Before
+    public void setUp() {
+        backend = Backend.getInstance();
+        Session session = HibernateUtil.getSession();
+        session.beginTransaction();
+        DatabasePopulator.createModels().forEach(session::saveOrUpdate);
+        DatabasePopulator.createCars().forEach(session::saveOrUpdate);
+        DatabasePopulator.createCorporateCustomers().forEach(session::saveOrUpdate);
+        DatabasePopulator.createIndividualCustomers().forEach(session::saveOrUpdate);
+        DatabasePopulator.createRentals(session).forEach(session::saveOrUpdate);
+        session.getTransaction().commit();
+    }
+
+    @After
+    public void tearDown() {
+        Session session = HibernateUtil.getSession();
+        session.beginTransaction();
+        session.createQuery("delete from RentalEntity").executeUpdate();
+        session.createQuery("delete from CarEntity").executeUpdate();
+        session.createQuery("delete from ModelEntity").executeUpdate();
+        session.createQuery("delete from CustomerEntity").executeUpdate();
+        session.createQuery("delete from CorporateCustomerEntity").executeUpdate();
+        session.createQuery("delete from IndividualCustomerEntity").executeUpdate();
+        session.getTransaction().commit();
+    }
+
+    @Test
+    public void testGetCustomer() {
+        // arrange
+        String customerName = "Mary O'Kart";
+        String expectedCustomerAddressStart = "1 Racing Road";
+        // act
+        Customer customer = backend.getCustomer(customerName);
+        // assert
+        assertTrue(customer.getAddress().startsWith(expectedCustomerAddressStart));
+    }
+
+    @Test
+    public void testGetModels() {
+        // arrange
+        String vehicleClass = "Midsized";
+        Set<String> expectedModelNames = Set.of("Malibu", "Model 3");
+        // act
+        Set<Model> models = backend.getModels(vehicleClass);
+        Set<String> actualModelNames = models.stream().map(Model::getModel).collect(Collectors.toSet());
+        // assert
+        assertEquals(expectedModelNames, actualModelNames);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/unl/cse/csce361/car_rental/backend/DatabaseTest.java b/src/test/java/edu/unl/cse/csce361/car_rental/backend/DatabaseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a6fc2ebc7616d9814404625ca8319a172c73046
--- /dev/null
+++ b/src/test/java/edu/unl/cse/csce361/car_rental/backend/DatabaseTest.java
@@ -0,0 +1,63 @@
+package edu.unl.cse.csce361.car_rental.backend;
+
+import org.hibernate.Session;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.*;
+
+public class DatabaseTest {
+
+    Session session;
+
+    @Before
+    public void setUp() {
+        session = HibernateUtil.getSession();
+        session.beginTransaction();
+        DatabasePopulator.createModels().forEach(session::saveOrUpdate);
+        DatabasePopulator.createCars().forEach(session::saveOrUpdate);
+        DatabasePopulator.createCorporateCustomers().forEach(session::saveOrUpdate);
+        DatabasePopulator.createIndividualCustomers().forEach(session::saveOrUpdate);
+        DatabasePopulator.createRentals(session).forEach(session::saveOrUpdate);
+        session.getTransaction().commit();
+    }
+
+    @After
+    public void tearDown() {
+        session.beginTransaction();
+        session.createQuery("delete from RentalEntity").executeUpdate();
+        session.createQuery("delete from CarEntity").executeUpdate();
+        session.createQuery("delete from ModelEntity").executeUpdate();
+        session.createQuery("delete from CustomerEntity").executeUpdate();
+        session.createQuery("delete from CorporateCustomerEntity").executeUpdate();
+        session.createQuery("delete from IndividualCustomerEntity").executeUpdate();
+        session.getTransaction().commit();
+    }
+
+    @Test
+    public void testGetIndividualCustomerByName() {
+        // arrange
+        String customerName = "Mary O'Kart";
+        String expectedCustomerAddressStart = "1 Racing Road";
+        // act
+        Customer customer = CustomerEntity.getCustomerByName(customerName);
+        // assert
+        assertTrue(customer.getAddress().startsWith(expectedCustomerAddressStart));
+    }
+
+    @Test
+    public void testGetModelsByClass() {
+        // arrange
+        Model.VehicleClass vehicleClass = Model.VehicleClass.MIDSIZED;
+        Set<String> expectedModelNames = Set.of("Malibu", "Model 3");
+        // act
+        Set<Model> models = ModelEntity.getModelsByClass(vehicleClass);
+        Set<String> actualModelNames = models.stream().map(Model::getModel).collect(Collectors.toSet());
+        // assert
+        assertEquals(expectedModelNames, actualModelNames);
+    }
+}
\ No newline at end of file