Index: main/waeup.fceokene/trunk/src/waeup/fceokene/interfaces.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/interfaces.py	(revision 14556)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/interfaces.py	(revision 14566)
@@ -63,12 +63,36 @@
         )
 
-    penalty_nce_ft = schema.Float(
-        title = _(u'NCE Full-Time Penalty Fee'),
+    penalty_nce1_ft = schema.Float(
+        title = _(u'NCE I Full-Time Penalty Fee'),
         default = 0.0,
         required = False,
         )
 
-    penalty_nce_pt = schema.Float(
-        title = _(u'NCE Sandwich and Part-Time Penalty Fee'),
+    penalty_nce2_ft = schema.Float(
+        title = _(u'NCE II Full-Time Penalty Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    penalty_nce3_ft = schema.Float(
+        title = _(u'NCE II Full-Time Penalty Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    penalty_nce1_pt = schema.Float(
+        title = _(u'NCE I Sandwich and Part-Time Penalty Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    penalty_nce2_pt = schema.Float(
+        title = _(u'NCE II Sandwich and Part-Time Penalty Fee'),
+        default = 0.0,
+        required = False,
+        )
+
+    penalty_nce3_pt = schema.Float(
+        title = _(u'NCE III Sandwich and Part-Time Penalty Fee'),
         default = 0.0,
         required = False,
Index: main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_utils.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_utils.py	(revision 14556)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_utils.py	(revision 14566)
@@ -47,9 +47,9 @@
         self.certificate.end_level = 300
         self.student['studycourse'].current_verdict = 'B'
-        self.student['studycourse'].current_level = 300
+        self.student['studycourse'].current_level = 200
         configuration = createObject('waeup.SessionConfiguration')
         configuration.academic_session = 2005
         self.app['configuration'].addSessionConfiguration(configuration)
-        self.app['configuration']['2005'].penalty_nce_ft = 99.0
+        self.app['configuration']['2005'].penalty_nce3_ft = 99.0
         self.student['studycourse'].certificate.study_mode = 'nce_ft'
         utils = getUtility(IStudentsUtils)
@@ -57,7 +57,7 @@
         IWorkflowState(self.student).setState('returning')
         error, payment = utils.setPaymentDetails('schoolfee',self.student)
-        self.assertEqual(payment.amount_auth, 12224.0) # 11975 + 150 + 99
+        self.assertEqual(payment.amount_auth, 14124.0) # 13875 + 150 + 99
         self.student['studycourse'].previous_verdict = 'O'
         error, payment = utils.setPaymentDetails('schoolfee',self.student)
-        self.assertEqual(payment.amount_auth, 12125.0) # 11975 + 150
+        self.assertEqual(payment.amount_auth, 14025.0) # 13875 + 150
         return
Index: main/waeup.fceokene/trunk/src/waeup/fceokene/students/utils.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/students/utils.py	(revision 14556)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/students/utils.py	(revision 14566)
@@ -277,5 +277,6 @@
         if amount in (0.0, None):
             return _(u'Amount could not be determined.'), None
-        # Add session specific penalty fee.
+
+        # Add session and level specific penalty fee.
         if category == 'schoolfee' and student.current_mode in (
             'ug_ft', 'de_ft'):
@@ -283,8 +284,26 @@
         elif category == 'schoolfee' and student.current_mode in (
             'nce_ft',) and student['studycourse'].previous_verdict != 'O':
-            amount += academic_session.penalty_nce_ft
+            # NCE I fresh
+            if student.current_level == 100 and student.state == CLEARED:
+                amount += academic_session.penalty_nce1_ft
+            # NCE II
+            elif student.current_level in (100, 110, 120) and \
+                student.state == RETURNING:
+                amount += academic_session.penalty_nce2_ft
+            # NCE III (except repeaters and spillovers)
+            elif student.current_level in (200, 210, 220):
+                amount += academic_session.penalty_nce3_ft
         elif category == 'schoolfee' and student.current_mode in (
             'nce_sw', 'nce_pt'):
-            amount += academic_session.penalty_nce_pt
+            # NCE I fresh
+            if student.current_level == 100 and student.state == CLEARED:
+                amount += academic_session.penalty_nce1_pt
+            # NCE II
+            elif student.current_level in (100, 110, 120) and \
+                student.state == RETURNING:
+                amount += academic_session.penalty_nce2_pt
+            # NCE III (except repeaters and spillovers)
+            elif student.current_level in (200, 210, 220):
+                amount += academic_session.penalty_nce3_pt
         elif category == 'schoolfee' and student.current_mode in ('prence',):
             amount += academic_session.penalty_prence
