METADATA_TABLE=${METADATA_DB}.db_metadata_versions
 MIGRATION_DIR=${POLICY_HOME}/etc/db/migration
 ZERO_VERSION="0"
+BASE_VERSION="0800"
 UPGRADE_SQL_SUFFIX=".upgrade.sql"
 DOWNGRADE_SQL_SUFFIX=".downgrade.sql"
 
     echo
 }
 
+#####################################################
+# current_schema
+#####################################################
+
+function current_schema
+{
+    if [ "${DEBUG}" = "y" ]; then
+        echo "-- current_schema --"
+        set -x
+    fi
+
+    local rc
+    local query="SELECT count(table_name) from information_schema.tables where table_schema='${SCHEMA}'"
+
+    TABLES_IN_SCHEMA=$(${MYSQL} --skip-column-names --silent --execute "${query}")
+    if [ ${TABLES_IN_SCHEMA} -gt 0 ] && [ "${BASE_VERSION}" \> "${CURRENT_RELEASE}" ]; then
+        set_current_release "${BASE_VERSION}"
+        return $?
+    fi
+
+    return 0
+}
+
 #####################################################
 # ensure global metadata
 #####################################################
     local sql rc
 
     sql="CREATE TABLE IF NOT EXISTS ${METADATA_HISTORY} "
-    sql=${sql}"(script VARCHAR(80) NOT NULL, "
-    sql=${sql}"operation VARCHAR(10), from_version VARCHAR(20), to_version VARCHAR(20), success VARCHAR(1), "
-    sql=${sql}"atTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
-    sql=${sql}"PRIMARY KEY(to_version, script, operation));"
+    sql=${sql}"(ID bigint(20) unsigned NOT NULL AUTO_INCREMENT, script VARCHAR(80) NOT NULL, "
+    sql=${sql}"operation VARCHAR(10), from_version VARCHAR(20), to_version VARCHAR(20), tag VARCHAR(20), "
+    sql=${sql}"success VARCHAR(1), atTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
+    sql=${sql}"PRIMARY KEY(ID));"
     ${MYSQL} --execute "${sql}"
     rc=$?
     if [ ${rc} -ne 0 ]; then
     return 0
 }
 
+#####################################################
+# previous_release
+#####################################################
+
+function previous_release
+{
+    if [ "${DEBUG}" = "y" ]; then
+        echo "-- previous_release --"
+        set -x
+    fi
+    local current_release="${1}"
+    local current_release_int_val previous_release_int_val previous_release
+
+    if [ $current_release == $ZERO_VERSION ] || [ $current_release == $BASE_VERSION ]; then
+         PREVIOUS_RELEASE=$ZERO_VERSION
+    else
+         current_release_int_val=$(echo $current_release  | awk '{$0=int($0)}1')
+         let previous_release_int_val=$current_release_int_val-100
+         if [ $previous_release_int_val -lt 1000 ]; then
+                 previous_release="0"$previous_release_int_val
+         else
+                 previous_release=$previous_release_int_val
+         fi
+         PREVIOUS_RELEASE=$previous_release
+    fi
+
+    return 0
+}
+
 #####################################################
 # execute sql script history
 #####################################################
         set -x
     fi
 
-    local script="${1}" operation="${2}" success="${3}" to_version="${4}"
+    local script="${1}" operation="${2}" success="${3}" from_version="${4}" to_version="${5}" tag="${6}"
     if [ $operation == "downgrade" ]; then
        to_version=${TARGET_DOWNGRADE_RELEASE}
     fi
-    from_version=${CURRENT_RELEASE}
-    local sql="INSERT INTO ${METADATA_HISTORY}(script,operation,from_version,to_version,success,atTime) "
-    sql=${sql}"VALUES ('${script}','${operation}','${from_version}','${to_version}','${success}',now()) "
-    sql=${sql}"ON DUPLICATE KEY UPDATE operation=values(operation),from_version=values(from_version),"
-    sql=${sql}"success=values(success), atTime=values(atTime);"
+
+    local sql="INSERT INTO ${METADATA_HISTORY}(script,operation,from_version,to_version,tag,success,atTime) "
+    sql=${sql}"VALUES ('${script}','${operation}','${from_version}','${to_version}','${tag}','${success}',now()) "
 
     ${MYSQL} --execute "${sql}"
     return $?
         set -x
     fi
 
-    local operation="${1}" script="${2}" scriptPath="${3}" schemaVersion="${4}"
+    local operation="${1}" script="${2}" scriptPath="${3}" fromVersion="${4}" toVersion="${5}" tag="${6}"
 
     echo
     echo "> ${operation} ${script}"
         success="1"
     fi
 
-    track_script "${script}" "${operation}" "${success}" "${schemaVersion}"
+    track_script "${script}" "${operation}" "${success}" "${fromVersion}" "${toVersion}" "${tag}"
 
     return ${rc}
 }
         set -x
     fi
 
-    local sqlName sqlFile schemaVersion upgradeSqls rc
-
-    ${MYSQL} --execute "USE ${SCHEMA_DB}"
+    local sqlName sqlFile schemaVersion upgradeSqls rc tagDate tag
+    tagDate=$(date +%d%m%y%H%M%S)
 
     echo "upgrade: ${CURRENT_RELEASE} -> ${TARGET_UPGRADE_RELEASE}"
 
         for sqlFile in ${upgradeSqls}; do
             sqlName=$(basename "${sqlFile}")
             schemaVersion="$(basename $(dirname $(dirname $sqlFile)))"
+            previous_release $schemaVersion
             if [ "${schemaVersion}" -gt "${CURRENT_RELEASE}" ] && \
                 [ "${schemaVersion}" -le "${TARGET_UPGRADE_RELEASE}" ]; then
-                run_script "upgrade" "${sqlName}" "${sqlFile}" "${schemaVersion}"
+                tag=${tagDate}"${schemaVersion}u"
+                run_script "upgrade" "${sqlName}" "${sqlFile}" "${PREVIOUS_RELEASE}" "${schemaVersion}" "${tag}"
                 rc=$?
                 if [ ${rc} -ne 0 ]; then
                     echo "${SCHEMA}: upgrade aborted at ${schemaVersion} by script ${sqlName}"
         set -x
     fi
 
-    local sqlName sqlFile schemaVersion downgradeSqls rc
-
-    ${MYSQL} --execute "USE ${SCHEMA_DB}"
+    local sqlName sqlFile schemaVersion downgradeSqls rc tagDate tag
+    tagDate=$(date +%d%m%y%H%M%S)
 
     echo "downgrade: ${CURRENT_RELEASE} -> ${TARGET_DOWNGRADE_RELEASE}"
 
             schemaVersion="$(basename $(dirname $(dirname $sqlFile)))"
             if [ "${schemaVersion}" -le "${CURRENT_RELEASE}" ] && \
                 [ "${schemaVersion}" -gt "${TARGET_DOWNGRADE_RELEASE}" ]; then
-                run_script "downgrade" "${sqlName}" "${sqlFile}" "${schemaVersion}"
+                tag=${tagDate}"${schemaVersion}d"
+                run_script "downgrade" "${sqlName}" "${sqlFile}" "${schemaVersion}" "${PREVIOUS_RELEASE}" ${tag}
                 rc=$?
                 if [ ${rc} -ne 0 ]; then
                     echo "${SCHEMA}: downgrade aborted at ${schemaVersion} by script ${sqlName}"
     local versionSql="SELECT * FROM ${METADATA_TABLE} WHERE name='${SCHEMA}';"
     ${MYSQL} --execute "${versionSql}"
 
-    local historySql="SELECT * FROM ${METADATA_HISTORY} ORDER BY atTime ASC;"
+    local historySql="SELECT * FROM ${METADATA_HISTORY} ORDER BY id, atTime ASC;"
     ${MYSQL} --execute "${historySql}"
 
     okay
              INPUT_TARGET_RELEASE=$1
              ;;
         -f|--from)      shift
-             INPUT_CURRENT_RELEASE=$1
+             INPUT_FROM_RELEASE=$1
              ;;
         -o|--operation) shift
              OPERATION=$1
     DOWNGRADE_DIR=${UPGRADE_DIR}
     METADATA_HISTORY="${METADATA_DB}.\`${SCHEMA}_change_history\`"
     TARGET_RELEASE=${INPUT_TARGET_RELEASE}
-    CURRENT_RELEASE=${INPUT_CURRENT_RELEASE}
 
     if is_upgrade && is_downgrade; then
         echo "${SCHEMA}: failure: invalid configuration: ${UPGRADE_SQL_SUFFIX} and "\
         fi
     fi
 
+    # Check if the schema has already been installed
+    current_schema
+
+    if [ -n "${INPUT_FROM_RELEASE}" ]; then
+        if [ "${CURRENT_RELEASE}" \> "${INPUT_FROM_RELEASE}" ] || [ "${CURRENT_RELEASE}" \< "${INPUT_FROM_RELEASE}" ]; then
+            echo "${SCHEMA}: On version ${CURRENT_RELEASE} cannot ${OPERATION} from ${INPUT_FROM_RELEASE}"
+            continue
+        else
+            CURRENT_RELEASE=${INPUT_FROM_RELEASE}
+        fi
+    fi
+
     case ${OPERATION} in
         upgrade)     if upgrade; then
                          echo "${SCHEMA}: OK: upgrade (${CURRENT_RELEASE})"