diff --git a/main/course_home/activity.php b/main/course_home/activity.php
index 3f92d829ad..8b3119640e 100755
--- a/main/course_home/activity.php
+++ b/main/course_home/activity.php
@@ -53,6 +53,15 @@ if (api_is_platform_admin()) {
 	}
 }
 
+// Course legal
+$enabled = api_get_plugin_setting('courselegal', 'tool_enable');
+$pluginExtra = null;
+if ($enabled == 'true') {
+    require_once api_get_path(SYS_PLUGIN_PATH).'courselegal/config.php';
+    $plugin = CourseLegalPlugin::create();
+    $pluginExtra = $plugin->getTeacherLink();
+}
+
 //	COURSE ADMIN ONLY VIEW
 
 // Start of tools for CourseAdmins (teachers/tutors)
@@ -66,6 +75,7 @@ if ($session_id == 0 && api_is_course_admin() && api_is_allowed_to_edit(null, tr
 		<div class="confirmation-message" id="id_confirmation_message" style="display:none"></div>
 	</div>';
 
+    $content .= $pluginExtra;
 
 	if (api_get_setting('show_session_data') == 'true' && $session_id > 0) {
         $content .= '<div class="courseadminview">
@@ -90,6 +100,7 @@ if ($session_id == 0 && api_is_course_admin() && api_is_allowed_to_edit(null, tr
     $content .= return_block(get_lang('Administration'),  $items , 'course-tools-administration');
 
 } elseif (api_is_coach()) {
+    $content .= $pluginExtra;
 	if (api_get_setting('show_session_data') == 'true' && $session_id > 0) {
 		$content .= '<div class="row">
 			<span class="viewcaption">'.get_lang('SessionData').'</span>
@@ -102,6 +113,7 @@ if ($session_id == 0 && api_is_course_admin() && api_is_allowed_to_edit(null, tr
     $my_list = CourseHome::get_tools_category(TOOL_STUDENT_VIEW);
     $content .= CourseHome::show_tools_category($my_list);
     $content .= '</div>';
+
 } else {
 	$my_list = CourseHome::get_tools_category(TOOL_STUDENT_VIEW);
 	if (count($my_list) > 0) {
diff --git a/main/course_info/legal.php b/main/course_info/legal.php
index c3abe38eff..e3bc6a5a28 100755
--- a/main/course_info/legal.php
+++ b/main/course_info/legal.php
@@ -22,10 +22,48 @@ if (empty($course_code)) {
 $course_info = CourseManager::get_course_information($course_code);
 $course_legal = $course_info['legal'];
 
+$enabled = api_get_plugin_setting('courselegal', 'tool_enable');
+$pluginExtra = null;
+$pluginLegal = false;
+if ($enabled == 'true') {
+    $pluginLegal = true;
+    require_once api_get_path(SYS_PLUGIN_PATH).'courselegal/config.php';
+    $plugin = CourseLegalPlugin::create();
+    $data = $plugin->getData($course_info['real_id'], $session_id);
+
+    $userData = $plugin->getUserAcceptedLegal(
+        $user_id,
+        $course_info['real_id'],
+        $session_id
+    );
+
+    if (!empty($data)) {
+        $course_legal = $data['content'];
+    }
+
+    if (isset($_GET['web_agreement_link'])) {
+        $plugin->saveUserMailLegal(
+            $_GET['web_agreement_link'],
+            $user_id,
+            $course_info['real_id'],
+            $session_id
+        );
+    }
+}
+
 // Build the form
 $form = new FormValidator('legal', 'GET', api_get_self().'?course_code='.$course_code.'&session_id='.$session_id);
+$pluginMessage = null;
+if ($pluginLegal && isset($userData)) {
+    if ($userData['web_agreement'] == 1 && empty($userData['mail_agreement'])) {
+        $pluginMessage = Display::return_message(get_lang('YouNeedToConfirmYourAgreementCheckYourEmail'));
+    }
+}
 $form->addElement('header', get_lang('CourseLegalAgreement'));
 $form->addElement('label', null, $course_legal);
+if ($pluginLegal && !empty($plugin)) {
+    $form->addElement('label', null, $plugin->getCurrentFile($course_info['real_id'], $session_id));
+}
 $form->addElement('hidden', 'course_code', $course_code);
 $form->addElement('hidden', 'session_id', $session_id);
 $form->addElement('checkbox', 'accept_legal', null, get_lang('AcceptLegal'));
@@ -52,8 +90,13 @@ if (api_check_user_access_to_legal($course_info['visibility']) && Session::read(
 $url = api_get_course_url($course_code, $session_id);
 
 if (empty($session_id)) {
-    if (CourseManager::is_user_subscribed_in_course($user_id, $course_code) || api_check_user_access_to_legal($course_info['visibility'])) {
-        $user_accepted_legal = CourseManager::is_user_accepted_legal($user_id, $course_code);
+    if (CourseManager::is_user_subscribed_in_course($user_id, $course_code) ||
+        api_check_user_access_to_legal($course_info['visibility'])
+    ) {
+        $user_accepted_legal = CourseManager::is_user_accepted_legal(
+            $user_id,
+            $course_code
+        );
         if ($user_accepted_legal || $user_pass_open_course) {
             //Redirect to course home
             header('Location: '.$url);
@@ -73,7 +116,7 @@ if (empty($session_id)) {
     if (isset($user_session_status) || api_check_user_access_to_legal($course_info['visibility'])) {
         $user_accepted_legal = CourseManager::is_user_accepted_legal($user_id, $course_code, $session_id);
         if ($user_accepted_legal || $user_pass_open_course) {
-            //Redirect to course session home
+            // Redirect to course session home.
             header('Location: '.$url);
             exit;
         }
@@ -82,6 +125,7 @@ if (empty($session_id)) {
     }
 }
 
-Display :: display_header($nameTools);
+Display :: display_header();
+echo $pluginMessage;
 $form->display();
 Display :: display_footer();
diff --git a/main/coursecopy/classes/CourseRestorer.class.php b/main/coursecopy/classes/CourseRestorer.class.php
index 37e03edea8..a50adea6c8 100755
--- a/main/coursecopy/classes/CourseRestorer.class.php
+++ b/main/coursecopy/classes/CourseRestorer.class.php
@@ -1263,11 +1263,15 @@ class CourseRestorer
 		}
 	}
 
-	/**
-	 * Restore Quiz
-	 */
-    public function restore_quizzes($session_id = 0, $respect_base_content = false)
-    {
+    /**
+     * Restore Quiz
+     * @param int $session_id
+     * @param bool $respect_base_content
+     */
+    public function restore_quizzes(
+        $session_id = 0,
+        $respect_base_content = false
+    ) {
 		if ($this->course->has_resources(RESOURCE_QUIZ)) {
 			$table_qui = Database :: get_course_table(TABLE_QUIZ_TEST);
 			$table_rel = Database :: get_course_table(TABLE_QUIZ_TEST_QUESTION);
@@ -1309,7 +1313,9 @@ class CourseRestorer
                     );
 
 					global $_custom;
-					if (isset($_custom['exercises_clean_dates_when_restoring']) && $_custom['exercises_clean_dates_when_restoring']) {
+					if (isset($_custom['exercises_clean_dates_when_restoring']) &&
+                        $_custom['exercises_clean_dates_when_restoring']
+                    ) {
 						$quiz->start_time = null;
 						$quiz->end_time   = null;
 					}
@@ -1418,7 +1424,10 @@ class CourseRestorer
 
             if ($new_id) {
                 if (!empty($question->picture)) {
-                    $question_temp = Question::read($new_id, $this->destination_course_info['real_id']);
+                    $question_temp = Question::read(
+                        $new_id,
+                        $this->destination_course_info['real_id']
+                    );
 
                     $documentPath = api_get_path(SYS_COURSE_PATH).$this->destination_course_info['path'].'/document';
                     // picture path
@@ -1452,7 +1461,7 @@ class CourseRestorer
                             c_id = ".$this->destination_course_id." ,
                             id = '".$index."',
                             question_id = '".$new_id."',
-                            answer = '".self::DBUTF8escapestring($answer['answer'])."',
+                            answer = '".api_htmlentities(self::DBUTF8escapestring($answer['answer']))."',
                             correct = '".$answer['correct']."',
                             comment = '".self::DBUTF8escapestring($answer['comment'])."',
                             ponderation = '".$answer['ponderation']."',
@@ -1550,8 +1559,7 @@ class CourseRestorer
                 } else {
                     $new_options = array();
                     if (isset($question->question_options)) {
-                        foreach($question->question_options as $obj) {
-
+                        foreach ($question->question_options as $obj) {
                             $item = array();
                             $item['question_id'] = $new_id;
                             $item['c_id'] = $this->destination_course_id;
@@ -1561,6 +1569,7 @@ class CourseRestorer
                             $question_option_id = Database::insert($table_options, $item);
                             $new_options[$obj->obj->id] = $question_option_id;
                         }
+
                         foreach($correct_answers as $answer_id => $correct_answer) {
                             $params = array();
                             $params['correct'] = $new_options[$correct_answer];
diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php
index 5fa8755c26..90c996a5b8 100755
--- a/main/inc/lib/course.lib.php
+++ b/main/inc/lib/course.lib.php
@@ -3993,17 +3993,27 @@ class CourseManager
      */
     public static function is_user_accepted_legal($user_id, $course_code, $session_id = null)
     {
-        $user_id    = intval($user_id);
+        $user_id = intval($user_id);
         $course_code = Database::escape_string($course_code);
         $session_id = intval($session_id);
+
+        // Course legal
+        $enabled = api_get_plugin_setting('courselegal', 'tool_enable');
+
+        if ($enabled == 'true') {
+            require_once api_get_path(SYS_PLUGIN_PATH).'courselegal/config.php';
+            $plugin = CourseLegalPlugin::create();
+            return $plugin->isUserAcceptedLegal($user_id, $course_code, $session_id);
+        }
+
         if (empty($session_id)) {
             $table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
             $sql = "SELECT legal_agreement FROM $table
-                    WHERE user_id =  $user_id AND course_code  ='$course_code' ";
+                    WHERE user_id = $user_id AND course_code ='$course_code' ";
             $result = Database::query($sql);
             if (Database::num_rows($result) > 0 ) {
                 $result = Database::fetch_array($result);
-                if ($result['legal_agreement'] == 1 ) {
+                if ($result['legal_agreement'] == 1) {
                     return true;
                 }
             }
@@ -4011,11 +4021,11 @@ class CourseManager
         } else {
             $table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
             $sql = "SELECT legal_agreement FROM $table
-                    WHERE id_user =  $user_id AND course_code  ='$course_code' AND id_session = $session_id";
+                    WHERE id_user = $user_id AND course_code ='$course_code' AND id_session = $session_id";
             $result = Database::query($sql);
             if (Database::num_rows($result) > 0 ) {
                 $result = Database::fetch_array($result);
-                if ($result['legal_agreement'] == 1 ) {
+                if ($result['legal_agreement'] == 1) {
                     return true;
                 }
             }
@@ -4030,11 +4040,21 @@ class CourseManager
      * @param   string course code
      * @param   int session id
      */
-    function save_user_legal($user_id, $course_code, $session_id = null) {
+    public static function save_user_legal($user_id, $course_code, $session_id = null)
+    {
+        // Course plugin legal
+        $enabled = api_get_plugin_setting('courselegal', 'tool_enable');
+
+        if ($enabled == 'true') {
+            require_once api_get_path(SYS_PLUGIN_PATH).'courselegal/config.php';
+            $plugin = CourseLegalPlugin::create();
+            return $plugin->saveUserLegal($user_id, $course_code, $session_id);
+        }
 
-        $user_id    = intval($user_id);
+        $user_id = intval($user_id);
         $course_code = Database::escape_string($course_code);
         $session_id = intval($session_id);
+
         if (empty($session_id)) {
             $table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
             $sql = "UPDATE $table SET legal_agreement = '1'
diff --git a/main/inc/lib/database.lib.php b/main/inc/lib/database.lib.php
index 9758e8b334..51dd536e32 100755
--- a/main/inc/lib/database.lib.php
+++ b/main/inc/lib/database.lib.php
@@ -1150,7 +1150,7 @@ class Database {
             	var_dump($sql);
             }
             return self::insert_id();
-        }        
+        }
         return false;
     }
 
diff --git a/main/inc/lib/fileUpload.lib.php b/main/inc/lib/fileUpload.lib.php
index e9659f103b..feb8c59e42 100755
--- a/main/inc/lib/fileUpload.lib.php
+++ b/main/inc/lib/fileUpload.lib.php
@@ -185,7 +185,8 @@ function handle_uploaded_document(
     $to_user_id = null,
     $unzip = 0,
     $what_if_file_exists = '',
-    $output = true
+    $output = true,
+    $onlyUploadFile = false
 ) {
 	if (!$user_id) {
         die('Not a valid user.');
@@ -263,9 +264,17 @@ function handle_uploaded_document(
 			$document_name = get_document_title($uploaded_file['name']);
 			// Size of the uploaded file (in bytes)
 			$file_size = $uploaded_file['size'];
-
 			$files_perm = api_get_permissions_for_new_files();
-            //$doc_path = '/'.$clean_name;
+
+            if ($onlyUploadFile) {
+                $errorResult = moveUploadedFile($uploaded_file, $store_path);
+                if ($errorResult) {
+                    return $store_path;
+                } else {
+                    return $errorResult;
+                }
+            }
+
             $docId = DocumentManager::get_document_id($_course, $file_path, $current_session_id);
 
             // What to do if the target file exists
diff --git a/main/inc/lib/legal.lib.php b/main/inc/lib/legal.lib.php
index 124389fdcc..ce6e44c3e9 100755
--- a/main/inc/lib/legal.lib.php
+++ b/main/inc/lib/legal.lib.php
@@ -34,24 +34,26 @@ class LegalManager
 		if ($last['content'] != $content) {
 			$version = intval(LegalManager::get_last_condition_version($language));
 			$version++;
-			 $sql = "INSERT INTO $legal_table
-						SET language_id = '".Database::escape_string($language)."',
-							content = '".$content."',
-							changes= '".$changes."',
-							type = '".$type."',
-							version = '".Database::escape_string($version)."',
-							date = '".$time."'";
-			$result = Database::query($sql);
+			 $sql = "INSERT INTO $legal_table SET
+			            language_id = '".Database::escape_string($language)."',
+                        content = '".$content."',
+                        changes= '".$changes."',
+                        type = '".$type."',
+                        version = '".Database::escape_string($version)."',
+                        date = '".$time."'";
+			Database::query($sql);
+
 			return true;
 		} elseif($last['type'] != $type && $language==$last['language_id']) {
 			//update
 			$id = $last['legal_id'];
-			$sql = "UPDATE $legal_table
-					SET  changes= '".$changes."',
-					type = '".$type."',
-					date = '".$time."'
+			$sql = "UPDATE $legal_table SET
+                        changes= '".$changes."',
+                        type = '".$type."',
+                        date = '".$time."'
 					WHERE legal_id= $id  ";
-			$result = Database::query($sql);
+			Database::query($sql);
+
 			return true;
 		} else {
 			return false;
@@ -72,8 +74,7 @@ class LegalManager
 	 * @param int $language language id
 	 * @return array all the info of a Term and condition
 	 */
-
-	public static function get_last_condition_version ($language)
+	public static function get_last_condition_version($language)
     {
 		$legal_conditions_table = Database::get_main_table(TABLE_MAIN_LEGAL);
 		$language= Database::escape_string($language);
@@ -113,17 +114,21 @@ class LegalManager
 	 * @param int $language language id
 	 * @return boolean | int the version or false if does not exist
 	 */
-	public static function get_last_version ($language)
+	public static function get_last_version($language)
     {
 		$legal_conditions_table = Database::get_main_table(TABLE_MAIN_LEGAL);
 		$language= Database::escape_string($language);
-		$sql = "SELECT version FROM $legal_conditions_table WHERE language_id = '".$language."' ORDER BY version DESC LIMIT 1 ";
+		$sql = "SELECT version FROM $legal_conditions_table
+		        WHERE language_id = '".$language."'
+		        ORDER BY version DESC LIMIT 1 ";
 		$result = Database::query($sql);
 		if (Database::num_rows($result)>0){
 			$version = Database::fetch_array($result);
 			$version = explode(':',$version[0]);
+
 			return $version[0];
 		} else {
+
 			return false;
 		}
 	}
@@ -131,6 +136,7 @@ class LegalManager
 	/**
 	 * Show the last condition
 	 * @param array with type and content i.e array('type'=>'1', 'content'=>'hola');
+     *
 	 * @return string html preview
 	 */
 	public static function show_last_condition($term_preview)
@@ -247,7 +253,7 @@ class LegalManager
 	 * @param int The language id
 	 * @return int The current type of terms and conditions
 	 */
-	public static function get_type_of_terms_and_conditions ($legal_id,$language_id)
+	public static function get_type_of_terms_and_conditions($legal_id,$language_id)
     {
 		$legal_conditions_table = Database::get_main_table(TABLE_MAIN_LEGAL);
 		$legal_id=Database::escape_string($legal_id);
diff --git a/plugin/courselegal/CourseLegalPlugin.php b/plugin/courselegal/CourseLegalPlugin.php
new file mode 100755
index 0000000000..5b53698cc6
--- /dev/null
+++ b/plugin/courselegal/CourseLegalPlugin.php
@@ -0,0 +1,408 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+/**
+ * Class CourseLegalPlugin
+ */
+class CourseLegalPlugin extends Plugin
+{
+    public $isCoursePlugin = true;
+
+    // When creating a new course this settings are added to the course
+    public $course_settings = array(
+        array(
+            'name' => 'courselegal',
+            'type' => 'text'
+        )
+    );
+
+    /**
+     * @return CourseLegalPlugin
+     */
+    static function create()
+    {
+        static $result = null;
+        return $result ? $result : $result = new self();
+    }
+
+    /**
+     *
+     */
+    protected function __construct()
+    {
+        parent::__construct(
+            '0.1',
+            'Julio Montoya',
+            array(
+                'tool_enable' => 'boolean'
+            )
+        );
+    }
+
+    /**
+     * @return string
+     */
+    public function getTeacherLink()
+    {
+        $link = null;
+        if (api_is_allowed_to_edit()) {
+            $url = api_get_path(WEB_PLUGIN_PATH).'courselegal/start.php?'.api_get_cidreq();
+            $link = Display::url(
+                get_lang('Legal'),
+                $url,
+                array('class' => 'btn')
+            );
+        }
+
+        return $link;
+    }
+
+    /**
+     * @param int $userId
+     * @param int $courseId
+     * @param int $sessionId
+     *
+     * @return array
+     */
+    public function getUserAcceptedLegal($userId, $courseId, $sessionId)
+    {
+        $userId = intval($userId);
+        $courseId = intval($courseId);
+        $sessionId = intval($sessionId);
+
+        $table = Database::get_main_table('session_rel_course_rel_user_legal');
+        $sql = "SELECT *
+                FROM $table
+                WHERE user_id = $userId AND c_id = $courseId AND session_id = $sessionId";
+        $result = Database::query($sql);
+        $data = array();
+        if (Database::num_rows($result) > 0 ) {
+            $data = Database::fetch_array($result, 'ASSOC');
+        }
+
+        return $data;
+    }
+
+    /**
+     * @param int $userId
+     * @param string $courseCode
+     * @param int $sessionId
+     *
+     * @return bool
+     */
+    public function isUserAcceptedLegal($userId, $courseCode, $sessionId)
+    {
+        $courseInfo = api_get_course_info($courseCode);
+        $courseId = $courseInfo['real_id'];
+        $result = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
+
+        if (!empty($result)) {
+            if ($result['mail_agreement'] == 1 &&
+                $result['web_agreement'] == 1
+            ) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+ * @param int $userId
+ * @param int $courseCode
+ * @param int $sessionId
+ *
+ * @return bool
+ */
+    public function saveUserLegal($userId, $courseCode, $sessionId)
+    {
+        $courseInfo = api_get_course_info($courseCode);
+        $courseId = $courseInfo['real_id'];
+        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
+
+        $id = false;
+        if (empty($data)) {
+            $table = Database::get_main_table(
+                'session_rel_course_rel_user_legal'
+            );
+            $uniqueId = api_get_unique_id();
+            $values = array(
+                'user_id' => $userId,
+                'c_id' => $courseId,
+                'session_id' => $sessionId,
+                'web_agreement' => 1,
+                'web_agreement_date' => api_get_utc_datetime(),
+                'mail_agreement_link' => $uniqueId
+            );
+            $id = Database::insert($table, $values);
+
+            $url = api_get_path(WEB_CODE_PATH).'course_info/legal.php?web_agreement_link='.$uniqueId.'&course_code='.Security::remove_XSS($courseCode).'&session_id='.$sessionId;
+            $courseUrl = Display::url($url, $url);
+
+            $subject = get_lang("MailAgreement");
+            $message = sprintf(get_lang("MailAgreementWasSentWithClickX"), $courseUrl);
+            MessageManager::send_message_simple($userId, $subject, $message);
+        }
+
+        return $id;
+    }
+
+    /**
+     * @param string $link
+     * @param int $userId
+     * @param int $courseId
+     * @param int $sessionId
+     *
+     * @return bool
+     */
+    public function saveUserMailLegal($link, $userId, $courseId, $sessionId)
+    {
+        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
+
+        if (empty($data)) {
+            return null;
+        }
+
+        if ($data['mail_agreement_link'] == $link) {
+            $table = Database::get_main_table('session_rel_course_rel_user_legal');
+            $id = $data['id'];
+            $values = array(
+                'mail_agreement' => 1,
+                'mail_agreement_date' => api_get_utc_datetime()
+            );
+            Database::update($table, $values, array('id = ?' => array($id)));
+        }
+    }
+
+    /**
+     * @param int $courseId
+     * @param int $sessionId
+     */
+    public function warnUsersByEmail($courseId, $sessionId)
+    {
+        $courseInfo = api_get_course_info_by_id($courseId);
+        $courseCode = $courseInfo['code'];
+
+        if (empty($sessionId)) {
+            $students = CourseManager::get_student_list_from_course_code($courseCode, false);
+        } else {
+            $students = CourseManager::get_student_list_from_course_code($courseCode, true, $sessionId);
+        }
+
+        $url = api_get_course_url($courseCode, $sessionId);
+        $url = Display::url($url, $url);
+
+        $subject = get_lang("AgreementUpdated");
+        $message = sprintf(get_lang("AgreementWasUpdatedClickHere"), $url);
+
+        if (!empty($students)) {
+            foreach ($students as $student) {
+                $userId = $student['user_id'];
+                MessageManager::send_message_simple($userId, $subject, $message);
+            }
+        }
+    }
+
+    /**
+     * @param int $courseId
+     * @param int $sessionId
+     */
+    public function removePreviousAgreements($courseId, $sessionId)
+    {
+        $table = Database::get_main_table('session_rel_course_rel_user_legal');
+        $sessionId = intval($sessionId);
+        $courseId = intval($courseId);
+        $sql = "DELETE FROM $table
+                WHERE c_id = '$courseId' AND session_id = $sessionId ";
+        Database::query($sql);
+    }
+
+    /**
+     * @param array $values
+     * @param array  $file $_FILES['uploaded_file']
+     */
+    public function save($values, $file = array(), $deleteFile = false)
+    {
+        $table = Database::get_main_table('session_rel_course_legal');
+
+        $courseId = $values['c_id'];
+        $sessionId = $values['session_id'];
+
+        $conditions = array(
+            'c_id' => $courseId,
+            'session_id' => $sessionId,
+        );
+
+        $legalData = $this->getData($courseId, $sessionId);
+
+        $conditions['content'] = $values['content'];
+
+        $course = api_get_course_info();
+        $coursePath = api_get_path(SYS_COURSE_PATH).$course['directory'].'/courselegal';
+
+        if (!is_dir($coursePath)) {
+            mkdir($coursePath, api_get_permissions_for_new_directories());
+        }
+
+        require_once api_get_path(LIBRARY_PATH) . 'fileUpload.lib.php';
+        $uploadOk = process_uploaded_file($file, false);
+
+        $fileName = null;
+        if ($uploadOk) {
+            $uploadResult = handle_uploaded_document(
+                $course,
+                $file,
+                $coursePath,
+                '/',
+                api_get_user_id(),
+                api_get_group_id(),
+                null,
+                false,
+                false,
+                false,
+                true
+            );
+
+            if ($uploadResult) {
+                $fileName = basename($uploadResult);
+                // Delete old one if exists.
+                if ($legalData) {
+                    if (!empty($legalData['filename'])) {
+                        $fileToDelete = $coursePath.'/'.$legalData['filename'];
+                        if (file_exists($fileToDelete)) {
+                            unlink($fileToDelete);
+                        }
+                    }
+                }
+            }
+        }
+        $conditions['filename'] = $fileName;
+
+        if (empty($legalData)) {
+            $id = Database::insert($table, $conditions);
+        } else {
+            $id = $legalData['id'];
+            Database::update(
+                $table,
+                array(
+                    'content' => $values['content'],
+                    'filename' => $fileName
+                ),
+                array('id = ? ' => $id)
+            );
+        }
+
+        if ($deleteFile) {
+            Database::update(
+                $table,
+                array('filename' => ''),
+                array('id = ? ' => $id)
+            );
+            if (!empty($legalData['filename'])) {
+                $fileToDelete = $coursePath . '/' . $legalData['filename'];
+                if (file_exists($fileToDelete)) {
+                    unlink($fileToDelete);
+                }
+            }
+        }
+
+        if (isset($values['remove_previous_agreements']) && !empty($values['remove_previous_agreements'])) {
+            $this->removePreviousAgreements($courseId, $sessionId);
+        }
+
+        if (isset($values['warn_users_by_email']) && !empty($values['warn_users_by_email'])) {
+            $this->warnUsersByEmail($courseId, $sessionId);
+        }
+    }
+
+    /**
+     * @param int $courseId
+     * @param int $sessionId
+     * @return array|mixed
+     */
+    public function getData($courseId, $sessionId)
+    {
+        $table = Database::get_main_table('session_rel_course_legal');
+        $conditions = array(
+            'c_id  = ? AND session_id = ? ' => array(
+                $courseId,
+                $sessionId
+            )
+        );
+
+        $result = Database::select('*', $table, array('where' => $conditions));
+        $legalData = isset($result) && !empty($result) ? current($result) : array();
+
+        return $legalData;
+    }
+
+    /**
+     * @param int $courseId
+     * @param int $sessionId
+     *
+     * @return string
+     */
+    public function getCurrentFile($courseId, $sessionId)
+    {
+        $data = $this->getData($courseId, $sessionId);
+
+        if (isset($data['filename']) && !empty($data['filename'])) {
+            $course = api_get_course_info_by_id($courseId);
+
+            $coursePath = api_get_path(SYS_COURSE_PATH).$course['directory'].'/courselegal';
+            $file = $coursePath.'/'.$data['filename'];
+
+            if (file_exists($file)) {
+                return Display::url(
+                    $data['filename'],
+                    api_get_path(WEB_COURSE_PATH).$course['directory'].'/courselegal/'.$data['filename']
+                );
+            }
+        }
+    }
+
+    public function install()
+    {
+        $table = Database::get_main_table('session_rel_course_legal');
+        $sql = "CREATE TABLE IF NOT EXISTS $table (
+                    id int PRIMARY KEY AUTO_INCREMENT,
+                    c_id int,
+                    session_id int,
+                    content text,
+                    filename varchar(255)
+                )";
+        Database::query($sql);
+
+        $table = Database::get_main_table('session_rel_course_rel_user_legal');
+
+        $sql = "CREATE TABLE IF NOT EXISTS $table (
+                    id int PRIMARY KEY AUTO_INCREMENT,
+                    user_id int,
+                    c_id int,
+                    session_id int,
+                    web_agreement varchar(255),
+                    web_agreement_date datetime,
+                    mail_agreement varchar(255),
+                    mail_agreement_date datetime,
+                    mail_agreement_link varchar(255)
+                )";
+        Database::query($sql);
+
+        // Installing course settings
+        $this->install_course_fields_in_all_courses(false);
+    }
+
+    public function uninstall()
+    {
+        $table = Database::get_main_table('session_rel_course_legal');
+        $sql = "DROP TABLE $table ";
+        Database::query($sql);
+
+        $table = Database::get_main_table('session_rel_course_rel_user_legal');
+        $sql = "DROP TABLE $table ";
+        Database::query($sql);
+
+        // Deleting course settings
+        $this->uninstall_course_fields_in_all_courses($this->course_settings);
+    }
+}
diff --git a/plugin/courselegal/config.php b/plugin/courselegal/config.php
new file mode 100644
index 0000000000..eb585b25d4
--- /dev/null
+++ b/plugin/courselegal/config.php
@@ -0,0 +1,6 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+require_once __DIR__ . '/../../main/inc/global.inc.php';
+require_once api_get_path(LIBRARY_PATH).'plugin.class.php';
+require_once __DIR__.'/CourseLegalPlugin.php';
diff --git a/plugin/courselegal/install.php b/plugin/courselegal/install.php
new file mode 100644
index 0000000000..d8a4aaefca
--- /dev/null
+++ b/plugin/courselegal/install.php
@@ -0,0 +1,9 @@
+<?php
+/* For license terms, see /license.txt */
+
+require_once dirname(__FILE__) . '/config.php';
+
+if (!api_is_platform_admin()) {
+    die ('You must have admin permissions to install plugins');
+}
+CourseLegalPlugin::create()->install();
diff --git a/plugin/courselegal/lang/english.php b/plugin/courselegal/lang/english.php
new file mode 100755
index 0000000000..0951993162
--- /dev/null
+++ b/plugin/courselegal/lang/english.php
@@ -0,0 +1,4 @@
+<?php
+
+$strings['plugin_title'] = "Course agreements";
+$strings['plugin_comment'] = "Course agreements";
diff --git a/plugin/courselegal/lang/spanish.php b/plugin/courselegal/lang/spanish.php
new file mode 100755
index 0000000000..0951993162
--- /dev/null
+++ b/plugin/courselegal/lang/spanish.php
@@ -0,0 +1,4 @@
+<?php
+
+$strings['plugin_title'] = "Course agreements";
+$strings['plugin_comment'] = "Course agreements";
diff --git a/plugin/courselegal/plugin.php b/plugin/courselegal/plugin.php
new file mode 100755
index 0000000000..1d5db350a2
--- /dev/null
+++ b/plugin/courselegal/plugin.php
@@ -0,0 +1,5 @@
+<?php
+
+require_once dirname(__FILE__) . '/config.php';
+
+$plugin_info = CourseLegalPlugin::create()->get_info();
diff --git a/plugin/courselegal/start.php b/plugin/courselegal/start.php
new file mode 100755
index 0000000000..77f3985308
--- /dev/null
+++ b/plugin/courselegal/start.php
@@ -0,0 +1,51 @@
+<?php
+/* For license terms, see /license.txt */
+$language_file = array('document','gradebook');
+
+require_once dirname(__FILE__) . '/config.php';
+
+// Course legal
+$enabled = api_get_plugin_setting('courselegal', 'tool_enable');
+
+if ($enabled != 'true') {
+    api_not_allowed(true);
+}
+
+if (!api_is_allowed_to_edit()) {
+    api_not_allowed(true);
+}
+
+$legal = CourseLegalPlugin::create();
+$url = api_get_self().'?'.api_get_cidreq();
+$courseId = api_get_course_int_id();
+$sessionId = api_get_session_id();
+
+$form = new FormValidator('plugin', 'post', $url );
+$form->addElement('header', get_lang('CourseLegal'));
+$form->addElement('hidden', 'session_id', $sessionId);
+$form->addElement('hidden', 'c_id', $courseId);
+$form->addElement('textarea', 'content', get_lang('Text'));
+$form->addElement('file', 'uploaded_file', get_lang('File'));
+$file = $legal->getCurrentFile($courseId, $sessionId);
+
+if (!empty($file)) {
+    $form->addElement('label', get_lang('File'), $file);
+}
+
+$form->addElement('checkbox', 'delete_file', null, get_lang('DeleteFile'));
+$form->addElement('checkbox', 'remove_previous_agreements', null, get_lang('RemoveAllUserAgreements'));
+$form->addElement('checkbox', 'warn_users_by_email', null, get_lang('WarnAllUsersByEmail'));
+$form->addElement('button', 'submit', get_lang('Send'));
+
+$form->setDefaults($legal->getData($courseId, $sessionId));
+
+if ($form->validate()) {
+    $values = $form->getSubmitValues();
+    $file = isset($_FILES['uploaded_file']) ? $_FILES['uploaded_file'] : array();
+    $deleteFile = isset($values['delete_file']) ? $values['delete_file'] : false;
+    $legal->save($values, $file, $deleteFile);
+    header('Location: '.$url);
+    exit;
+}
+Display::display_header(get_lang('CourseLegal'));
+$form->display();