Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 12956)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 12957)
@@ -244,4 +244,30 @@
         entries.append(new_entry)
     return entries
+
+def getImporters(context):
+    importers = getAllUtilitiesRegisteredFor(IBatchProcessor)
+    importer_props = []
+    for x in importers:
+        # Skip User Processor if user isn't allowed to manage users.
+        if x.util_name == 'userprocessor' and not checkPermission(
+            'waeup.manageUsers', context):
+            continue
+        iface_fields = schema.getFields(x.iface)
+        available_fields = []
+        for key in iface_fields.keys():
+            iface_fields[key] = (iface_fields[key].__class__.__name__,
+                iface_fields[key].required)
+        for value in x.available_fields:
+            available_fields.append(
+                dict(f_name=value,
+                     f_type=iface_fields.get(value, (None, False))[0],
+                     f_required=iface_fields.get(value, (None, False))[1]
+                     )
+                )
+        available_fields = sorted(available_fields, key=lambda k: k[
+            'f_name'])
+        importer_props.append(
+            dict(title=x.name, name=x.util_name, fields=available_fields))
+    return sorted(importer_props, key=lambda k: k['title'])
 
 class LocalRoleAssignmentUtilityView(object):
@@ -579,4 +605,38 @@
         self._set_payment_cats()
         self._set_sex()
+        return
+
+class ProcessorsOverview(KofaPage):
+    grok.context(IUniversity)
+    grok.name('processors')
+    grok.require('waeup.Public')
+    label = _(u'Available Processors (Importers)')
+    pnav = 0
+
+    def getImporters(self):
+        return getImporters(self.context)
+
+class SkeletonDownloadView(UtilityView, grok.View):
+    grok.context(IUniversity)
+    grok.name('skeleton')
+    grok.require('waeup.Public')
+
+    def update(self, processorname=None):
+        self.processorname = self.request.form['name']
+        self.filename = ('%s_000.csv' %
+            self.processorname.replace('processor','import'))
+        return
+
+    def render(self):
+        #ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
+        #self.context.logger.info(
+        #    '%s - skeleton downloaded: %s' % (ob_class, self.filename))
+        self.response.setHeader(
+            'Content-Type', 'text/csv; charset=UTF-8')
+        self.response.setHeader(
+            'Content-Disposition:', 'attachment; filename="%s' % self.filename)
+        processor = getUtility(IBatchProcessor, name=self.processorname)
+        csv_data = processor.get_csv_skeleton()
+        return csv_data
 
 class AdministrationPage(KofaPage):
@@ -1047,4 +1107,5 @@
     upload_button =_(u'Upload')
     cancel_button =_(u'Back to Data Center')
+    doclink = DOCLINK + '/datacenter/import_stages.html#stage-1-file-upload'
 
     def getPreviewHeader(self):
@@ -1195,28 +1256,5 @@
 
     def getImporters(self):
-        importers = getAllUtilitiesRegisteredFor(IBatchProcessor)
-        importer_props = []
-        for x in importers:
-            # Skip User Processor if user isn't allowed to manage users.
-            if x.util_name == 'userprocessor' and not checkPermission(
-                'waeup.manageUsers', self.context):
-                continue
-            iface_fields = schema.getFields(x.iface)
-            available_fields = []
-            for key in iface_fields.keys():
-                iface_fields[key] = (iface_fields[key].__class__.__name__,
-                    iface_fields[key].required)
-            for value in x.available_fields:
-                available_fields.append(
-                    dict(f_name=value,
-                         f_type=iface_fields.get(value, (None, False))[0],
-                         f_required=iface_fields.get(value, (None, False))[1]
-                         )
-                    )
-            available_fields = sorted(available_fields, key=lambda k: k[
-                'f_name'])
-            importer_props.append(
-                dict(title=x.name, name=x.util_name, fields=available_fields))
-        return sorted(importer_props, key=lambda k: k['title'])
+        return getImporters(self.context)
 
 class FileDownloadView(UtilityView, grok.View):
@@ -1240,27 +1278,4 @@
         fullpath = os.path.join(self.context.storage, self.filename)
         return open(fullpath, 'rb').read()
-
-class SkeletonDownloadView(UtilityView, grok.View):
-    grok.context(IDataCenter)
-    grok.name('skeleton')
-    grok.require('waeup.manageDataCenter')
-
-    def update(self, processorname=None):
-        self.processorname = self.request.form['name']
-        self.filename = ('%s_000.csv' %
-            self.processorname.replace('processor','import'))
-        return
-
-    def render(self):
-        #ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
-        #self.context.logger.info(
-        #    '%s - skeleton downloaded: %s' % (ob_class, self.filename))
-        self.response.setHeader(
-            'Content-Type', 'text/csv; charset=UTF-8')
-        self.response.setHeader(
-            'Content-Disposition:', 'attachment; filename="%s' % self.filename)
-        processor = getUtility(IBatchProcessor, name=self.processorname)
-        csv_data = processor.get_csv_skeleton()
-        return csv_data
 
 class DatacenterImportStep1(KofaPage):
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt	(revision 12956)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/datacenteruploadpage.pt	(revision 12957)
@@ -1,4 +1,4 @@
 <p i18n:translate="">
-    Before uploading a file check that your file header corresponds
+    Before uploading a file, check that your file header corresponds
     with header format of the selected processor. All available headers
     are listed below.
@@ -65,57 +65,2 @@
     The data will be imported according to the information given.
 </p>
-
-<br /><br />
-
-<h2 i18n:translate="">Available Processors (Importers)</h2>
-
-<table i18n:domain="waeup.kofa" class="table table-condensed">
-  <thead>
-    <tr>
-      <th i18n:translate="">Processor</th>
-      <th i18n:translate="">Required Schema Fields</th>
-      <th i18n:translate="">Optional Schema Fields</th>
-      <th i18n:translate="">Non-Schema Fields</th>
-    </tr>
-  </thead>
-  <tr tal:repeat="importer view/getImporters">
-    <td>
-      <span tal:content="importer/title">TITLE</span><br /><br />
-      <a i18n:translate="" class="btn btn-primary btn-xs"
-         tal:attributes="href python: 'skeleton?name=' + importer['name']">
-         Download CSV File Template
-      </a>
-    </td>
-    <td nowrap>
-      <span tal:repeat="field importer/fields">
-          <tal:schemafield condition="field/f_type">
-            <tal:required condition="field/f_required">
-              <span tal:replace="field/f_name"></span>
-              (<span tal:replace="field/f_type"></span>)
-              <br />
-            </tal:required>
-          </tal:schemafield>
-      </span>
-    </td>
-    <td nowrap>
-      <span tal:repeat="field importer/fields">
-          <tal:schemafield condition="field/f_type">
-            <tal:notrequired condition="not:field/f_required">
-              <span tal:replace="field/f_name"></span>
-              (<span tal:replace="field/f_type"></span>)
-              <br />
-            </tal:notrequired>
-          </tal:schemafield>
-      </span>
-    </td>
-    <td>
-      <span tal:repeat="field importer/fields">
-          <tal:extrafield condition="not:field/f_type">
-            <span tal:replace="field/f_name"></span>
-            <br />
-          </tal:extrafield>
-      </span>
-    </td>
-
-  </tr>
-</table>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/processorsoverview.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/processorsoverview.pt	(revision 12957)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/processorsoverview.pt	(revision 12957)
@@ -0,0 +1,82 @@
+<div class="panel-group"
+     id="accordion"
+     role="tablist"
+     aria-multiselectable="true"
+     i18n:domain="waeup.kofa"
+     >
+  <div class="panel panel-default"  tal:repeat="importer view/getImporters">
+    <div class="panel-heading" role="tab"
+         tal:attributes="id python: 'heading' + importer['name']">
+      <h4 class="panel-title">
+        <a class="collapsed" data-toggle="collapse"
+           data-parent="#accordion"
+           tal:attributes="href python: '#collapse' + importer['name'];
+                           aria-controls python: 'collapse' + importer['name']"
+           aria-expanded="false"
+           i18n:translate="">
+          <span tal:replace="importer/title">TITLE</span>
+        </a>
+      </h4>
+    </div>
+    <div tal:attributes="id python: 'collapse' + importer['name'];
+                         aria-labelledby python: 'heading' + importer['name']"
+         class="panel-collapse collapse"
+         role="tabpanel">
+      <div class="panel-body">
+        <table class="table table-condensed">
+          <thead>
+            <tr>
+              <th i18n:translate="">Processor</th>
+              <th i18n:translate="">Required Schema Fields</th>
+              <th i18n:translate="">Optional Schema Fields</th>
+              <th i18n:translate="">Non-Schema Fields</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr>
+              <td>
+                <span tal:content="importer/title">TITLE</span><br /><br />
+                <a i18n:translate="" class="btn btn-primary btn-xs"
+                   tal:attributes="href python: view.url(layout.site)
+                                        + '/skeleton?name='
+                                        + importer['name']">
+                   Download CSV File Template
+                </a>
+              </td>
+              <td nowrap>
+                <span tal:repeat="field importer/fields">
+                    <tal:schemafield condition="field/f_type">
+                      <tal:required condition="field/f_required">
+                        <span tal:replace="field/f_name"></span>
+                        (<span tal:replace="field/f_type"></span>)
+                        <br />
+                      </tal:required>
+                    </tal:schemafield>
+                </span>
+              </td>
+              <td nowrap>
+                <span tal:repeat="field importer/fields">
+                    <tal:schemafield condition="field/f_type">
+                      <tal:notrequired condition="not:field/f_required">
+                        <span tal:replace="field/f_name"></span>
+                        (<span tal:replace="field/f_type"></span>)
+                        <br />
+                      </tal:notrequired>
+                    </tal:schemafield>
+                </span>
+              </td>
+              <td>
+                <span tal:repeat="field importer/fields">
+                    <tal:extrafield condition="not:field/f_type">
+                      <span tal:replace="field/f_name"></span>
+                      <br />
+                    </tal:extrafield>
+                </span>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
+</div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 12956)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/tests/test_browser.py	(revision 12957)
@@ -371,16 +371,4 @@
         return
 
-    def test_skeleton_download(self):
-        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
-        self.browser.open(self.datacenter_path)
-        self.browser.getLink("Upload data").click()
-        self.browser.getLink(url='skeleton?name=facultyprocessor').click()
-        self.assertEqual(self.browser.headers['Status'], '200 Ok')
-        self.assertEqual(self.browser.headers['Content-Type'],
-                         'text/csv; charset=UTF-8')
-        self.assertEqual(self.browser.contents,
-            'code,local_roles,title,title_prefix\r\n')
-        return
-
     def test_user_data_import_permission(self):
         upload_path = 'http://localhost/app/datacenter/upload'
@@ -505,2 +493,13 @@
         self.assertEqual(self.browser.headers['Status'], '200 Ok')
         self.assertTrue('id="headingStudentStates"' in self.browser.contents)
+
+    def test_processors_overview(self):
+        self.browser.open('http://localhost/app/processors')
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.browser.getLink(url='skeleton?name=facultyprocessor').click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.headers['Content-Type'],
+                         'text/csv; charset=UTF-8')
+        self.assertEqual(self.browser.contents,
+            'code,local_roles,title,title_prefix\r\n')
+        return
