anchor.diff:  image::QuickStart/SpringBoot/timeTableAppScreenshot.png[]
   
   Your service will assign `Lesson` instances to `Timeslot` and `Room` instances automatically
  -by using AI to adhere to hard and soft scheduling _constraints_, such as:
  +by using AI to adhere to hard and soft scheduling _constraints_, such as the following examples:
   
   * A room can have at most one lesson at the same time.
   * A teacher can teach at most one lesson at the same time.
   * A student can attend at most one lesson at the same time.
  -* A teacher prefers to teach in a single room.
  +* A teacher prefers to teach every lesson in a single room.
   * A teacher prefers to teach sequential lessons and dislikes gaps between lessons.
   
  -Mathematically speaking, school timetabling is an _NP-hard_ problem.
  -That means it is difficult to scale.
  -Simply brute force iterating through all possible combinations takes millions of years
  -for a non-trivial dataset, even on a supercomputer.
  +Mathematically speaking, school timetabling is an _NP-hard_ problem. This means it is difficult to scale. Simply using brute force to iterate through all possible combinations would take millions of years for a non-trivial data set, even on a supercomputer.
   Luckily, AI constraint solvers such as OptaPlanner have advanced algorithms
   that deliver a near-optimal solution in a reasonable amount of time.
   
  
positive.code: ----
  ====
  +
  For simplicity's sake, this code handles only one `TimeTable`,
  but it is straightforward to enable multi-tenancy and handle multiple `TimeTable` instances of different high schools in parallel.
  +
  The `getTimeTable()` method returns the latest time table from the database.
  It uses the `ScoreManager` (which is automatically injected)
  to calculate the score of that time table, so the UI can show the score.
  +
  The `solve()` method starts a job to solve the current time table and store the time slot and room assignments in the database.
  It uses the `SolverManager.solveAndListen()` method to listen to intermediate best solutions
  and update the database accordingly.
  This enables the UI to show progress while the backend is still solving.
  
  . Adjust the `TimeTableControllerTest` accordingly, now that the `solve()` method returns immediately.
  Poll for the latest solution until the solver finishes solving:
  +
  ====
  
negative.code: :experimental:
  
  This guide walks you through the process of creating a Spring Boot
  application with OptaPlanner's constraint solving artificial intelligence (AI).
  
  == What you will build
  
  