diff --git a/res/layout/fragment_wizard_page_single_text_field.xml b/res/layout/fragment_wizard_page_single_text_field.xml
index 6f6e8fcbe918d08045b4126bc81a72207717ef8f..9a76c502bc7e0deb99cbbc0e6e7a0550ad5ef402 100644
--- a/res/layout/fragment_wizard_page_single_text_field.xml
+++ b/res/layout/fragment_wizard_page_single_text_field.xml
@@ -37,6 +37,10 @@
                 android:inputType="text"
                 android:layout_marginBottom="16dp" />
 
+            <TextView android:id="@+id/wizard_text_field_feedback"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" />
+
             <TextView style="@style/WizardFormLabel"
                 android:id="@+id/wizard_text_field_desc" />
 
diff --git a/src/net/i2p/android/wizard/model/SingleTextFieldPage.java b/src/net/i2p/android/wizard/model/SingleTextFieldPage.java
index c86bba6dac964bd5b794ddaa03bbd9bb367ea1ee..30e75958a5c63e94a32c699298c7eaf722c2697d 100644
--- a/src/net/i2p/android/wizard/model/SingleTextFieldPage.java
+++ b/src/net/i2p/android/wizard/model/SingleTextFieldPage.java
@@ -47,7 +47,7 @@ public class SingleTextFieldPage extends Page {
 
     @Override
     public boolean isCompleted() {
-        return !TextUtils.isEmpty(mData.getString(SIMPLE_DATA_KEY));
+        return (!TextUtils.isEmpty(mData.getString(SIMPLE_DATA_KEY))) && isValid();
     }
 
     public SingleTextFieldPage setDefault(String def) {
@@ -67,4 +67,18 @@ public class SingleTextFieldPage extends Page {
     public String getDesc() {
         return mDesc;
     }
+
+    // Override these in subclasses to add content verification.
+
+    public boolean isValid() {
+        return true;
+    }
+
+    public boolean showFeedback() {
+        return false;
+    }
+
+    public String getFeedback() {
+        return "";
+    }
 }
diff --git a/src/net/i2p/android/wizard/ui/SingleTextFieldFragment.java b/src/net/i2p/android/wizard/ui/SingleTextFieldFragment.java
index 12007a33f9ae41ca40772e21b5a1d43b7fce0962..6566f17851f1cc679c494da90a96e0ffb25e0074 100644
--- a/src/net/i2p/android/wizard/ui/SingleTextFieldFragment.java
+++ b/src/net/i2p/android/wizard/ui/SingleTextFieldFragment.java
@@ -39,6 +39,7 @@ public class SingleTextFieldFragment extends Fragment {
     private String mKey;
     private SingleTextFieldPage mPage;
     private TextView mFieldView;
+    private TextView mFeedbackView;
 
     public static SingleTextFieldFragment create(String key) {
         Bundle args = new Bundle();
@@ -76,6 +77,9 @@ public class SingleTextFieldFragment extends Fragment {
             mFieldView.setText(mPage.getDefault());
             mPage.getData().putString(Page.SIMPLE_DATA_KEY, mPage.getDefault());
         }
+
+        mFeedbackView = (TextView) rootView.findViewById(R.id.wizard_text_field_feedback);
+
         return rootView;
     }
 
@@ -112,6 +116,9 @@ public class SingleTextFieldFragment extends Fragment {
                 mPage.getData().putString(Page.SIMPLE_DATA_KEY,
                         (editable != null) ? editable.toString() : null);
                 mPage.notifyDataChanged();
+                if (mPage.showFeedback()) {
+                    mFeedbackView.setText(mPage.getFeedback());
+                }
             }
         });
     }