diff --git a/app/routes.py b/app/routes.py
index e3dfd9db9647bc74d7dc10064c2316167fd7c2ad..820e3fb983c0d941f18e8b985b1115e86529de43 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -1,30 +1,19 @@
-
-
-import csv
 import os
 import random
 import secrets
 from datetime import datetime, date
-import tempfile
 import json
 
-from flask import (
-    Flask,
-    render_template,
-    request,
-    session,
-    flash,
-    redirect,
-    url_for,
-    Blueprint,
-    send_file
-)
-
+from flask import (render_template,
+                   request,
+                   session,
+                   flash,
+                   redirect,
+                   url_for)
 from sqlalchemy import and_
 from flask_login import current_user, login_user, logout_user, login_required
-from flask_babel import Babel, _, lazy_gettext as _l
 
-from app import app, db, babel
+from app import app, db
 from app.models import background_question, experiment
 from app.models import background_question_answer
 from app.models import page, question, embody_question, embody_answer
@@ -32,6 +21,7 @@ from app.models import background_question_option
 from app.models import answer_set, answer, forced_id
 from app.models import user, trial_randomization
 from app.forms import LoginForm, RegisterForm, StartWithIdForm
+from app.utils import saved_data_as_file
 
 # Stimuli upload folder setting
 APP_ROOT = os.path.dirname(os.path.abspath(__file__))
@@ -407,8 +397,9 @@ def download_csv():
                 answer_row += ';'.join(bg_answers_list) + ';'
 
                 # append slider answers
-                slider_answers = answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set)\
-                    .order_by(answer.page_idpage)\
+                slider_answers = answer.query.filter_by(
+                    answer_set_idanswer_set=participant.idanswer_set) \
+                    .order_by(answer.page_idpage) \
                     .all()
 
                 answers_list = [str(a.answer).strip() for a in slider_answers]
@@ -418,8 +409,9 @@ def download_csv():
 
                 # append embody answers (coordinates)
                 # save embody answers as bitmap images
-                embody_answers = embody_answer.query.filter_by(answer_set_idanswer_set=participant.idanswer_set)\
-                    .order_by(embody_answer.page_idpage)\
+                embody_answers = embody_answer.query.filter_by(
+                    answer_set_idanswer_set=participant.idanswer_set) \
+                    .order_by(embody_answer.page_idpage) \
                     .all()
 
                 answers_list = []
@@ -465,22 +457,10 @@ def download_csv():
             csv += answer_row + '\r\n'
             answer_row = ''
 
-    try:
-        fd, path = tempfile.mkstemp()
-
-        with os.fdopen(fd, 'w') as tmp:
-            tmp.write(csv)
-            tmp.flush()
-
-            cur_date = date.today().strftime("%Y-%m-%d")
-            filename = "experiment_{}_{}.csv".format(exp_id, cur_date)
+    filename = "experiment_{}_{}.csv".format(
+        exp_id, date.today().strftime("%Y-%m-%d"))
 
-            return send_file(path,
-                             mimetype='text/csv',
-                             as_attachment=True,
-                             attachment_filename=filename)
-    finally:
-        os.remove(path)
+    return saved_data_as_file(filename, csv)
 
 
 @app.route('/researcher_info')
diff --git a/app/utils.py b/app/utils.py
index f7a9d257b3cf09639656011945b33b46e4958e09..b157f4d04da0daefa9913179c11349f09aa2ccad 100644
--- a/app/utils.py
+++ b/app/utils.py
@@ -1,4 +1,7 @@
+import os
+import tempfile
 from itertools import zip_longest
+from flask import send_file
 
 
 def map_values_to_int(values: dict):
@@ -15,3 +18,19 @@ def calculate_mean(values: list) -> float:
 
 def get_mean_from_slider_answers(answers):
     return [calculate_mean(values) for values in map_values_to_int(answers)]
+
+
+def saved_data_as_file(filename, data):
+    """write CSV data to temporary file on host and send that file
+    to requestor"""
+    try:
+        fd, path = tempfile.mkstemp()
+        with os.fdopen(fd, 'w') as tmp:
+            tmp.write(data)
+            tmp.flush()
+            return send_file(path,
+                             mimetype='text/csv',
+                             as_attachment=True,
+                             attachment_filename=filename)
+    finally:
+        os.remove(path)