# Gerrit User Summit 2017 - Schedule

## The Hackathon - September 30th (Sat) to October 1st (Sun)

Two days of hacking on Gerrit Code Review and for building new plugins
by contributors and people passionate about understanding and extending
Gerrit.

*** note
__By invitation only__

The number of places available is deliberately very limited.
The primary purpose of the hackathon is to speed up the communication
between Gerrit contributors with white-boarding face-to-face sessions
and pair programming in a quiet and co-located
roundtable.
***

## The User Summit, October 2nd (Mon) to 3rd (Tue)

Introduction, intermediate and advanced sessions on Gerrit Code Review.
The **Call For Papers is officially open**, [submit your talk proposal](cfp.md)
directly through [Gerrit Code Review](https://gerrit-review.googlesource.com/#/admin/projects/summit/2017)

The voting and final **selection of the agenda is totally driven by Community**,
the review score defines the chart of best rated talks.

> **Follow the instructions** described in the [sessions proposal section](cfp.md)
> and be active part of the Summit by sharing your experience and provide
> your feedback on how to improve Gerrit Code Review.

*** promo
__Open to everyone__

There are over 150 seats available on a first-come-first-served basis,
open to anyone who is using Gerrit Code Review or interested in adopting
it in their daily software development workflow.

[Register Now to the Gerrit User Summit 2017](https://www.eventbrite.co.uk/e/gerrit-user-summit-2017-tickets-34486175078)
***

### Monday

| Time  | Session                                                                      |
|-------|------------------------------------------------------------------------------|
|  8:00 | Registration Opens, Breakfast, Expo & Networking                             |
|  9:00 | Welcome introduction                                                         |
|  9:15 | [What's new in Gerrit 2.14.x](sessions/new-in-2.14.md)                       |
| 10:00 | [Gerrit at Google: Multi-master, multi-tenant](sessions/gerrit-at-google.md) |
| 10:45 | Break, Expo & Networking                                                     |
| 11:30 | PolyGerrit UX: Findings from research/experience on the new GUI              |
| 12:15 | Lunch, Expo & Networking                                                     |
| 14:00 | [Gerrit CI: keep logs forever](sessions/gerrit-ci-forever.md)                |
| 14:45 | [Beyond Gerrit](sessions/beyond-gerrit.md)                                   |
| 15:30 | Break, Expo & Networking                                                     |
| 16:00 | [What's new in Gerrit 2.15](sessions/new-in-2.15.md)                         |
| 16:45 | [Q&A with the Gerrit Maintainers](sessions/maintainers-qa.md)                |
| 17:30 | Drinks, Expo & Networking                                                    |

### Tuesday

| Time  | Session                                                                                             |
|-------|-----------------------------------------------------------------------------------------------------|
|  8:00 | Registration Opens, Breakfast, Expo & Networking                                                    |
|  9:15 | [Mining Gerrit Data on OpenStack](sessions/mining_gerrit.md)                                        |
| 10:00 | [Export Review, Projects and Metrics to powerful dashboards](sessions/gerrit-graphs-dashboards.md)  |
| 10:45 | Break, Expo & Networking                                                                            |
| 11:30 | Multi-master outside Google: rollout experience at Qualcomm                                         |
| 12:15 | Lunch, Expo & Networking                                                                            |
| 14:00 | [Extend Gerrit with Scripting](sessions/gerrit-scripting-plugins.md)                                |
| 14:20 | [A brand-new Gerrit integration for Jenkins](sessions/jenkins-gerrit-plugin.md)                     |
| 14:45 | [Diffy with enterprise grade](sessions/diffy-with-enterprise-grade.md)                              |
| 15:30 | Break, Expo & Networking                                                                            |
| 16:00 | Conference wrap-up and Closing Keynote                                                              |

