               registration: (scan, $stateParams, Router) ->
                 Router.getRegistration(scan, $stateParams.registration)
 
-          # The scan image detail page.
-          .state 'quip.subject.session.scan.image',
-            url: '/image/{timePoint:[1-9][0-9]*}'
+          # The registration volume state.
+          # The volume state parameter is the volume number.
+          .state 'quip.subject.session.scan.registration.volume',
+            url: '/volume/{volume:[1-9][0-9]*}'
             resolve:
-              image: (scan, $stateParams, Router) ->
-                timePoint = parseInt($stateParams.timePoint)
-                Router.getImageDetail(scan, timePoint)
+              volume: (registration, $stateParams, Router) ->
+                number = parseInt($stateParams.volume)
+                Router.getVolume(registration, number)
             views:
               'main@':
-                templateUrl: '/partials/image-detail.html'
-                controller:  'ImageDetailCtrl'
-
-          # The registration image detail page.
-          .state 'quip.subject.session.scan.registration.image',
-            url: '/image/{timePoint:[1-9][0-9]*}'
-            resolve:
-              image: (registration, $stateParams, Router) ->
-                timePoint = parseInt($stateParams.timePoint)
-                Router.getImageDetail(registration, timePoint)
-            views:
-              'main@':
-                templateUrl: '/partials/image-detail.html'
-                controller:  'ImageDetailCtrl'
+                templateUrl: '/partials/volume.html'
+                controller:  'VolumeCtrl'
 
         # Redirect an URL with trailing slash to an URL without it.
         $urlRouterProvider.rule ($injector, $location) ->

                  throw ReferenceError.new("Subject #{ subject.number } does" +
                                           " not have a session #{ number }")
                # Grab the subject session embedded object.
                sess = subject.sessions[number - 1]
                # The session must have a detail foreign key.
                if not sess.detail?
                  throw ReferenceError.new("Subject #{ subject.number }" +
                                           " Session #{ sess.number } does" +
                                           " not have detail")

                # Fetch the session detail.
                Router.getSessionDetail(sess)
            views:
              'main@':
                templateUrl: '/partials/session-detail.html'
                controller:  'SessionDetailCtrl'

          # The scan state.
          .state 'quip.subject.session.scan',
            abstract: true
            url: '/scan/:scan'
            resolve:
              scan: (session, $stateParams, Router) ->
                Router.getScan(session, $stateParams.scan)

          # The registration state.
          .state 'quip.subject.session.scan.registration',
            abstract: true
            url: '/registration/:registration'

                controller:  'SubjectDetailCtrl'

          # The session state.
          # The session state parameter is the session number.
          .state 'quip.subject.session',
            url: '/session/{session:[0-9]+}'
            resolve:
