       </Route>
     </div>
 
+  _getSubjects: window.getSubjects = ->
+    missing = []
+    loose = []
+    inManifest = []
+
+    manifestedSubjectFilenames = []
+
+    for manifest, subjects of wizardData.manifests
+      for metadata in subjects
+        manifestedSubjectFilenames.push metadata.filenames...
+
+        files = (wizardData.subjects[filename] ? null for filename in metadata.filenames)
+        if null in files
+          missing.push {files, metadata}
+        else
+          inManifest.push {files, metadata}
+
+    for filename, file of wizardData.subjects when filename not in manifestedSubjectFilenames
+      files = [file]
+      loose.push {files}
+
+    [missing..., loose..., inManifest...]
+
   _renderSubjectRows: ->
-    for filename, {metadata} of wizardData.subjects
-      <tr key={filename}>
-        <td><strong>{filename}</strong></td>
-        {for column in MANIFEST_COLUMNS
-          <td title={column}>{metadata?[column] ? <span className="form-help">?</span>}</td>}
-
+    manifests = Object.keys(wizardData.manifests).length isnt 0
+
+    for {files, metadata} in @_getSubjects()
+      filenames = metadata?.filenames ? (name for {name} in files)
+
+      <tr key={filenames.join()}>
         <td>
-          {<button onClick={@removeSubject.bind this, filename}><i className="fa fa-times"></i></button>}
+          {for filename, i in filenames
+            <div>
+              {filename}
+              {unless files[i]?
+                <span className="form-help error" title="Missing image">&nbsp;<i className="fa fa-exclamation-circle"></i></span>}
+            </div>}
+          {if manifests and not metadata?
+            <div className="form-help warning"><i className="fa fa-exclamation-triangle"></i> Not present in any manifest</div>}
+        </td>
+
+        {for column in MANIFEST_COLUMNS[1...]
+          <td>{metadata?[column] ? <span className="form-help">?</span>}</td>}
+
+        <td>
+          <button onClick={@removeSubjects.bind this, filenames...}>&times;</button>
         </td>
       </tr>
 


    wizardData.update changes

  removeSubject: (filename) ->
    delete wizardData.subjects[filename]
    wizardData.emitChange()

  handleSubjectFilesSelection: (e) ->

          <p>Now you’ll be able to choose the images you want volunteers to look at (JPEG, PNG, or GIF, please). Optionally, you can include metadata about the images with a manifest file <small>(TODO: describe the manifest)</small>.</p>
          <p>These images will be uploaded during after last step of this process, which could take a long time depending on how many you select. Make sure you’ve got a steady internet connection. You’ll have an opportunity to review and refine your selection here before continuing.</p>

          {for manifestFilename of wizardData.manifests
            <span>
              {manifestFilename}
              <button onClick={@removeManifest.bind this, manifestFilename}>&times;</button>
              &emsp;
            </span>}

          <table>
            <thead>
              <tr>
                {<th>{column}</th> for column in MANIFEST_COLUMNS}
                <th></th>
              </tr>
            </thead>
