diff --git a/db/postgresql/issue395_pass_recovery.sql b/db/postgresql/issue395_pass_recovery.sql
deleted file mode 100644
index c1ff01942cb3253493ff1d22a426a015bbbfd81c..0000000000000000000000000000000000000000
--- a/db/postgresql/issue395_pass_recovery.sql
+++ /dev/null
@@ -1,42 +0,0 @@
-DROP FUNCTION IF EXISTS public.createrecoverytoken(paccountoremail character varying, ptoken character varying);
-CREATE OR REPLACE FUNCTION public.createrecoverytoken(paccountoremail character varying, ptoken character varying)
-  RETURNS character varying
-LANGUAGE plpgsql
-AS $function$
-DECLARE vAccountID INT DEFAULT null;
-  DECLARE vUserFullName TEXT;
-BEGIN
-  --select public.createrecoverytoken(
-  --	:paccountoremail,	-- put the paccountoremail parameter value instead of 'paccountoremail' (varchar)
-  --	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (varchar)
-  --);
-  -- get account ID
-  SELECT accounts.ID INTO vAccountID
-  FROM accounts
-  WHERE accounts.EMail = pAccountOrEMail OR
-        accounts.Login = pAccountOrEMail
-  LIMIT 1;
-  IF vAccountID is null THEN
-    RETURN '';
-  END IF;
-
-  vUserFullName := GetUserFullNameByAccountID(vAccountID);
-  IF vUserFullName IS NULL OR vUserFullName = '' THEN
-    RETURN '';
-  END IF;
-
-  -- transform all unused recovery tokens into used
-  UPDATE recovery_tokens
-  SET isUsed = 1
-  WHERE   isUsed = 0 AND
-          AccountID = vAccountID;
-
-  -- handle catch constraints violations
-  INSERT INTO recovery_tokens
-  ( AccountID, Token )
-  VALUES  (vAccountID, pToken);
-  RETURN vUserFullName;
-  EXCEPTION
-  when others then  RETURN -2; -- тип ???
-END
-$function$;
diff --git a/db/postgresql/issue335_copy_map.sql b/db/postgresql/patch_2_5_0.sql
similarity index 78%
rename from db/postgresql/issue335_copy_map.sql
rename to db/postgresql/patch_2_5_0.sql
index 12be3451a135670b0cde4ac968b73b621523b670..621601c30bdfdeb4be5078bdd4f77a26d5df0c29 100644
--- a/db/postgresql/issue335_copy_map.sql
+++ b/db/postgresql/patch_2_5_0.sql
@@ -1,3 +1,4 @@
+DROP FUNCTION IF EXISTS public.copy_map(withukd integer, withoutukd integer);
 CREATE OR REPLACE FUNCTION public.copy_map(withukd integer, withoutukd integer)
   RETURNS integer
 LANGUAGE plpgsql
@@ -113,3 +114,46 @@ begin
   return vCountModules;
 end;
 $function$;
+
+DROP FUNCTION IF EXISTS public.createrecoverytoken(paccountoremail character varying, ptoken character varying);
+CREATE OR REPLACE FUNCTION public.createrecoverytoken(paccountoremail character varying, ptoken character varying)
+  RETURNS character varying
+LANGUAGE plpgsql
+AS $function$
+DECLARE vAccountID INT DEFAULT null;
+  DECLARE vUserFullName TEXT;
+BEGIN
+  --select public.createrecoverytoken(
+  --	:paccountoremail,	-- put the paccountoremail parameter value instead of 'paccountoremail' (varchar)
+  --	:ptoken 	-- put the ptoken parameter value instead of 'ptoken' (varchar)
+  --);
+  -- get account ID
+  SELECT accounts.ID INTO vAccountID
+  FROM accounts
+  WHERE accounts.EMail = pAccountOrEMail OR
+        accounts.Login = pAccountOrEMail
+  LIMIT 1;
+  IF vAccountID is null THEN
+    RETURN '';
+  END IF;
+
+  vUserFullName := GetUserFullNameByAccountID(vAccountID);
+  IF vUserFullName IS NULL OR vUserFullName = '' THEN
+    RETURN '';
+  END IF;
+
+  -- transform all unused recovery tokens into used
+  UPDATE recovery_tokens
+  SET isUsed = 1
+  WHERE   isUsed = 0 AND
+          AccountID = vAccountID;
+
+  -- handle catch constraints violations
+  INSERT INTO recovery_tokens
+  ( AccountID, Token )
+  VALUES  (vAccountID, pToken);
+  RETURN vUserFullName;
+  EXCEPTION
+  when others then  RETURN -2; -- тип ???
+END
+$function$;
diff --git a/~dev_rating/application/views/faq.twig b/~dev_rating/application/views/faq.twig
index 53c190072d2ee61c636a00c8932bf658ed2f31b2..4dfea9ecdc4dd30bfc40001e5706b267cb3e3d4e 100644
--- a/~dev_rating/application/views/faq.twig
+++ b/~dev_rating/application/views/faq.twig
@@ -91,6 +91,23 @@
                         </p>
                     </div>
 
+                    <div class="question">
+                        <p>
+                            <b>Вопрос:</b> Мне как преподавателю приходится заполнять УКД по большому числу одинаковых дисциплин.
+                            Нельзя ли как-то упростить этот процесс?
+                        </p>
+                        <p>
+                        <p style="background-color:#C2E4FF;">
+                            <b>Ответ:</b> Возможно cкопировать уже заполненную УКД между дисциплинами. Для этого нужно нажать
+                            на кнопку "Импортировать УКД" на странице редактирования дисциплины. Делать это может только автор дисциплины.
+                            Обратите внимание, что копировать можно только УКД дисциплины с одинаковым типом контроля.
+                            <p style="background-color:#ECDDDD;">
+                            Перед копированием все старые модули (если есть) из УКД будут удалены!
+                            </p>
+                        </p>
+                        </p>
+                    </div>
+
                     <div class="question">
                         <p>
                             <b>Вопрос:</b> Дисциплина по курсовой работе или практике есть в моей нагрузке преподавателя, но не появилась в СБРС, почему?