diff --git a/opentech/apply/review/blocks.py b/opentech/apply/review/blocks.py
index 35ae38c08b4f7b4fc104f9bfcaf964b202de6d35..b6e95fbdc7bc8cca05daebbf048fc50f219f1a10 100644
--- a/opentech/apply/review/blocks.py
+++ b/opentech/apply/review/blocks.py
@@ -1,85 +1,17 @@
-import json
-
 from django import forms
-from django.forms import widgets
-from django.utils.safestring import mark_safe
 
 from django.utils.translation import ugettext_lazy as _
-from tinymce import TinyMCE
+
 from wagtail.core.blocks import RichTextBlock
 
-from opentech.apply.review.options import RATE_CHOICES, RECOMMENDATION_CHOICES
+from opentech.apply.review.fields import ScoredAnswerField
+from opentech.apply.review.options import RECOMMENDATION_CHOICES
 from opentech.apply.stream_forms.blocks import OptionalFormFieldBlock, CharFieldBlock, TextFieldBlock
 from opentech.apply.utils.blocks import CustomFormFieldsBlock, MustIncludeFieldBlock
-from opentech.apply.utils.options import MCE_ATTRIBUTES_SHORT, RICH_TEXT_WIDGET_SHORT
-
-
-class ScoredAnswerWidget(forms.MultiWidget):
-    def __init__(self, attrs=None):
-        _widgets = (
-            TinyMCE(attrs=attrs, mce_attrs=MCE_ATTRIBUTES_SHORT),
-            widgets.Select(attrs=attrs, choices=RATE_CHOICES),
-        )
-        super().__init__(_widgets, attrs)
-
-    def decompress(self, value):
-        if value:
-            return json.loads(value)
-        return [None, None]
-
-    def render(self, name, value, attrs=None, renderer=None):
-        """
-        Render the widget as an HTML string.
-        Required for the correct rendering of the TinyMCE widget.
-        """
-        if self.is_localized:
-            for widget in self.widgets:
-                widget.is_localized = self.is_localized
-        # value is a list of values, each corresponding to a widget
-        # in self.widgets.
-        if not isinstance(value, list):
-            value = self.decompress(value)
-
-        rendered = []
-        final_attrs = self.build_attrs(attrs)
-        input_type = final_attrs.pop('type', None)
-        id_ = final_attrs.get('id')
-        for i, widget in enumerate(self.widgets):
-            if input_type is not None:
-                widget.input_type = input_type
-            widget_name = '%s_%s' % (name, i)
-            try:
-                widget_value = value[i]
-            except IndexError:
-                widget_value = None
-            if id_:
-                widget_attrs = final_attrs.copy()
-                widget_attrs['id'] = '%s_%s' % (id_, i)
-            else:
-                widget_attrs = final_attrs
-
-            rendered.append(widget.render(widget_name, widget_value, widget_attrs, renderer))
-
-        return ''.join([mark_safe(item) for item in rendered])
-
-
-class ScoredAnswerField(forms.MultiValueField):
-    widget = ScoredAnswerWidget
-
-    def __init__(self, *args, **kwargs):
-        fields = (
-            forms.CharField(),
-            forms.ChoiceField(choices=RATE_CHOICES),
-        )
-
-        super().__init__(fields=fields, *args, **kwargs)
-
-    def compress(self, data_list):
-        return json.dumps(data_list)
+from opentech.apply.utils.options import RICH_TEXT_WIDGET_SHORT
 
 
 class ScoreFieldBlock(OptionalFormFieldBlock):
-
     field_class = ScoredAnswerField
 
     class Meta:
diff --git a/opentech/apply/review/fields.py b/opentech/apply/review/fields.py
new file mode 100644
index 0000000000000000000000000000000000000000..aeaeaa79eb517c85006e86140f7eb216f9536836
--- /dev/null
+++ b/opentech/apply/review/fields.py
@@ -0,0 +1,74 @@
+import json
+
+from django import forms
+from tinymce import TinyMCE
+
+from django.forms import widgets
+from django.utils.safestring import mark_safe
+
+from opentech.apply.review.options import RATE_CHOICES
+from opentech.apply.utils.options import MCE_ATTRIBUTES_SHORT
+
+
+class ScoredAnswerWidget(forms.MultiWidget):
+    def __init__(self, attrs=None):
+        _widgets = (
+            TinyMCE(attrs=attrs, mce_attrs=MCE_ATTRIBUTES_SHORT),
+            widgets.Select(attrs=attrs, choices=RATE_CHOICES),
+        )
+        super().__init__(_widgets, attrs)
+
+    def decompress(self, value):
+        if value:
+            return json.loads(value)
+        return [None, None]
+
+    def render(self, name, value, attrs=None, renderer=None):
+        """
+        Render the widget as an HTML string.
+        Required for the correct rendering of the TinyMCE widget.
+        """
+        if self.is_localized:
+            for widget in self.widgets:
+                widget.is_localized = self.is_localized
+        # value is a list of values, each corresponding to a widget
+        # in self.widgets.
+        if not isinstance(value, list):
+            value = self.decompress(value)
+
+        rendered = []
+        final_attrs = self.build_attrs(attrs)
+        input_type = final_attrs.pop('type', None)
+        id_ = final_attrs.get('id')
+        for i, widget in enumerate(self.widgets):
+            if input_type is not None:
+                widget.input_type = input_type
+            widget_name = '%s_%s' % (name, i)
+            try:
+                widget_value = value[i]
+            except IndexError:
+                widget_value = None
+            if id_:
+                widget_attrs = final_attrs.copy()
+                widget_attrs['id'] = '%s_%s' % (id_, i)
+            else:
+                widget_attrs = final_attrs
+
+            rendered.append(widget.render(widget_name, widget_value, widget_attrs, renderer))
+
+        return ''.join([mark_safe(item) for item in rendered])
+
+
+class ScoredAnswerField(forms.MultiValueField):
+    widget = ScoredAnswerWidget
+
+    def __init__(self, *args, **kwargs):
+        fields = (
+            forms.CharField(),
+            forms.ChoiceField(choices=RATE_CHOICES),
+        )
+
+        super().__init__(fields=fields, *args, **kwargs)
+
+    def compress(self, data_list):
+        return json.dumps(data_list)