diff --git a/lang/en_utf8/help/scorm/unpackmethod.html b/lang/en_utf8/help/scorm/unpackmethod.html
index e69de29..6febb81 100644
--- a/lang/en_utf8/help/scorm/unpackmethod.html
+++ b/lang/en_utf8/help/scorm/unpackmethod.html
@@ -0,0 +1,4 @@
+<h1>Unpack Method</h1>
+
+<p>If unpack method is set to Manifest, then the associated SCORM/AICC object is expected to be a ZIP file with the appropriate Manifest file inside.  If the unpack method is set to Direct URL, then this URL is assumed to be the launch URL for a single AICC Activity.  A psuedo package will be constructed around this and the communication mode will be assumed to be AICC HACP.
+</p>
diff --git a/lang/en_utf8/scorm.php b/lang/en_utf8/scorm.php
index 5a74b32..bfa7c7c 100644
--- a/lang/en_utf8/scorm.php
+++ b/lang/en_utf8/scorm.php
@@ -34,6 +34,7 @@ $string['package'] = 'Package file';
 $string['coursestruct'] = 'Course structure';
 $string['datadir'] = 'Filesystem Error: Can\'t create course data directory';
 $string['details'] = 'Track details';
+$string['direct'] = 'Direct URL';
 $string['directories'] = 'Show the directory links';
 $string['display'] = 'Display package';
 $string['displaydesc'] = 'This preference sets the default of whether to display the package or not for an activity';
@@ -80,10 +81,12 @@ $string['iframe'] = 'Current window';
 $string['iframedisplay'] = 'Open package in the current window';
 $string['incomplete'] = 'Incomplete';
 $string['interactions'] = 'Interactions';
+$string['invalidurl'] = 'Invalid URL specified for Direct URL activity';
 $string['last'] = 'Last accessed on';
 $string['lastaccess'] = 'Last access';
 $string['lastattempt'] = 'Last attempt';
 $string['location'] = 'Show the location bar';
+$string['manifest'] = 'Manifest';
 $string['max'] = 'Max score';
 $string['maximumattempts'] = 'Number of attempts';
 $string['maximumattemptsdesc'] = 'This preference sets the default number of maximum attempts for an activity';
@@ -162,6 +165,7 @@ $string['toolbar'] = 'Show the toolbar';
 $string['totaltime'] = 'Time';
 $string['trackingloose'] = 'WARNING: The tracking data of this package will be lost!';
 $string['type'] = 'Type';
+$string['unpackmethod'] = 'Unpack method';
 $string['validateascorm'] = 'Validate a package';
 $string['validation'] = 'Validation result';
 $string['validationtype'] = 'This preference set the DOMXML library used for validating SCORM Manifest. If you don\'t know leave the selected choice.';
diff --git a/mod/scorm/aicc.php b/mod/scorm/aicc.php
index 1cc80d1..8eee123 100755
--- a/mod/scorm/aicc.php
+++ b/mod/scorm/aicc.php
@@ -1,4 +1,8 @@
 <?php
+//error_log('SERVER: '.var_export($_SERVER, true));
+//error_log('REQUEST: '.var_export($_REQUEST, true));
+//error_log('COOKIE: '.var_export($_COOKIE, true));
+
     header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
     header("Cache-Control: no-cache");
     header("Pragma: no-cache");
@@ -370,4 +374,4 @@
             echo "error=3\r\nerror_text=Invalid Session ID\r\n";
         }
     }
-?>
\ No newline at end of file
+?>
diff --git a/mod/scorm/datamodels/aicclib.php b/mod/scorm/datamodels/aicclib.php
index 8764bc8..6a33ea6 100644
--- a/mod/scorm/datamodels/aicclib.php
+++ b/mod/scorm/datamodels/aicclib.php
@@ -90,8 +90,57 @@ function scorm_forge_cols_regexp($columns,$remodule='(".*")?,') {
     return $regexp;
 }
 
+/**
+ * generate a simple single activity AICC object
+ * structure to wrap around and externally linked
+ * AICC package URL
+ *
+ * @param object $scorm package record
+ */
+function scorm_aicc_generate_simple_sco($scorm) {
+    // find the old one
+    $scos = get_records('scorm_scoes','scorm',$scorm->id);
+    if (!empty($scos)) {
+        $sco = array_shift($scos);
+    }
+    else {
+        $sco = new object();
+    }
+    // get rid of old ones
+    if (!empty($scos)) {
+        foreach($scos as $oldsco) {
+            delete_records('scorm_scoes','id',$oldsco->id);
+            delete_records('scorm_scoes_track','scoid',$oldsco->id);
+        }
+    }
+    $sco->identifier = 'A1';
+    $sco->scorm = $scorm->id;
+    $sco->organization = '';
+    $sco->title = $scorm->name;
+    $sco->parent = '/';
+    // add the HACP signal to the activity launcher
+    if (preg_match('/\?/', $scorm->reference)) {
+        $sco->launch = $scorm->reference.'&CMI=HACP';
+    }
+    else {
+        $sco->launch = $scorm->reference.'?CMI=HACP';
+    }
+    $sco->scormtype = 'sco';
+    if (isset($sco->id)) {
+        update_record('scorm_scoes',addslashes_recursive($sco));
+        $id =  $sco->id;
+    } else {
+        $id = insert_record('scorm_scoes',addslashes_recursive($sco));
+    }
+    return $id;
+}
+
 function scorm_parse_aicc($pkgdir,$scormid) {
     $version = 'AICC';
+    $scorm = get_record('scorm','id',$scormid);
+    if ($scorm->unpackmethod == 'aiccdirect') {
+        return scorm_aicc_generate_simple_sco($scorm);
+    }
     $ids = array();
     $courses = array();
     $extaiccfiles = array('crs','des','au','cst','ort','pre','cmp');
diff --git a/mod/scorm/db/install.xml b/mod/scorm/db/install.xml
index fee5d2e..f3c6ef9 100644
--- a/mod/scorm/db/install.xml
+++ b/mod/scorm/db/install.xml
@@ -9,8 +9,9 @@
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" ENUM="false" NEXT="course"/>
         <FIELD NAME="course" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="id" NEXT="name"/>
         <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="course" NEXT="reference"/>
-        <FIELD NAME="reference" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="name" NEXT="summary"/>
-        <FIELD NAME="summary" TYPE="text" LENGTH="small" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="reference" NEXT="version"/>
+        <FIELD NAME="reference" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="name" NEXT="unpackmethod"/>
+        <FIELD NAME="unpackmethod" TYPE="char" LENGTH="10" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="reference" NEXT="summary"/>
+        <FIELD NAME="summary" TYPE="text" LENGTH="small" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="unpackmethod" NEXT="version"/>
         <FIELD NAME="version" TYPE="char" LENGTH="9" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="summary" NEXT="maxgrade"/>
         <FIELD NAME="maxgrade" TYPE="float" NOTNULL="true" UNSIGNED="false" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="version" NEXT="grademethod"/>
         <FIELD NAME="grademethod" TYPE="int" LENGTH="2" NOTNULL="true" UNSIGNED="false" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="maxgrade" NEXT="whatgrade"/>
diff --git a/mod/scorm/db/upgrade.php b/mod/scorm/db/upgrade.php
index 76b72fb..e276691 100644
--- a/mod/scorm/db/upgrade.php
+++ b/mod/scorm/db/upgrade.php
@@ -341,6 +341,27 @@ function xmldb_scorm_upgrade($oldversion=0) {
         }
     }
 
+
+    // Adding unpackmethod field to scorm table
+    if ($result && $oldversion < 2011041403) {
+        $table = new XMLDBTable('scorm');
+        $field = new XMLDBField('unpackmethod');
+        $field->setAttributes(XMLDB_TYPE_CHAR, '10', null, null, false, null, null, '', 'reference');
+        if (!field_exists($table, $field)) {
+            $result = $result && add_field($table, $field);
+        }
+        /// fix bad unpackmethod.
+        $scorms = get_records('scorm');
+        if (!empty($scorms)) {
+            foreach ($scorms as $scorm) {
+                if (empty($scorm->unpackmethod)) {
+                    $scorm->unpackmethod = 'manifest';
+                    update_record('scorm', $scorm);
+                }
+            }
+        }
+    }
+
     return $result;
 }
 
diff --git a/mod/scorm/lib.php b/mod/scorm/lib.php
index 96e5987..7d8e820 100755
--- a/mod/scorm/lib.php
+++ b/mod/scorm/lib.php
@@ -45,14 +45,14 @@ function scorm_add_instance($scorm) {
 
     if (($packagedata = scorm_check_package($scorm)) != null) {
         $scorm->pkgtype = $packagedata->pkgtype;
+        $scorm->version = $packagedata->pkgtype;
         $scorm->datadir = $packagedata->datadir;
         $scorm->launch = $packagedata->launch;
         $scorm->parse = 1;
-
         $scorm->timemodified = time();
         if (!scorm_external_link($scorm->reference)) {
             $scorm->md5hash = md5_file($CFG->dataroot.'/'.$scorm->course.'/'.$scorm->reference);
-        } else {
+        } else if ($scorm->unpackmethod != 'aiccdirect') {
             $scorm->dir = $CFG->dataroot.'/'.$scorm->course.'/moddata/scorm';
             $scorm->md5hash = md5_file($scorm->dir.$scorm->datadir.'/'.basename($scorm->reference));
         }
@@ -71,7 +71,7 @@ function scorm_add_instance($scorm) {
 
         $id = insert_record('scorm', $scorm);
 
-        if (scorm_external_link($scorm->reference) || ((basename($scorm->reference) != 'imsmanifest.xml') && ($scorm->reference[0] != '#'))) {
+        if (($scorm->unpackmethod != 'aiccdirect') && (scorm_external_link($scorm->reference) || ((basename($scorm->reference) != 'imsmanifest.xml') && ($scorm->reference[0] != '#')))) {
             // Rename temp scorm dir to scorm id
             $scorm->dir = $CFG->dataroot.'/'.$scorm->course.'/moddata/scorm';
             if (file_exists($scorm->dir.'/'.$id)) {
@@ -118,7 +118,7 @@ function scorm_update_instance($scorm) {
             $scorm->parse = 1;
             if (!scorm_external_link($scorm->reference) && $scorm->reference[0] != '#') { //dont set md5hash if this is from a repo.
                 $scorm->md5hash = md5_file($CFG->dataroot.'/'.$scorm->course.'/'.$scorm->reference);
-            } elseif($scorm->reference[0] != '#') { //dont set md5hash if this is from a repo.
+            } elseif($scorm->reference[0] != '#' && $scorm->unpackmethod == 'manifest') { //dont set md5hash if this is from a repo.
                 $scorm->dir = $CFG->dataroot.'/'.$scorm->course.'/moddata/scorm';
                 $scorm->md5hash = md5_file($scorm->dir.$scorm->datadir.'/'.basename($scorm->reference));
             }
@@ -144,7 +144,7 @@ function scorm_update_instance($scorm) {
         if (is_dir($scorm->dir.'/'.$scorm->id)) {
             scorm_delete_files($scorm->dir.'/'.$scorm->id);
         }
-        if (isset($scorm->datadir) && ($scorm->datadir != $scorm->id) && 
+        if ($scorm->unpackmethod == 'manifest' && isset($scorm->datadir) && ($scorm->datadir != $scorm->id) &&
            (scorm_external_link($scorm->reference) || ((basename($scorm->reference) != 'imsmanifest.xml') && ($scorm->reference[0] != '#')))) {
             rename($scorm->dir.$scorm->datadir,$scorm->dir.'/'.$scorm->id);
         }
diff --git a/mod/scorm/locallib.php b/mod/scorm/locallib.php
index 6c85817..8c94713 100755
--- a/mod/scorm/locallib.php
+++ b/mod/scorm/locallib.php
@@ -858,7 +858,6 @@ function scorm_validate($data) {
             return $validation;
         }
     }
-
     if ($reference[0] == '#') {
         if (isset($CFG->repositoryactivate) && $CFG->repositoryactivate) {
             $reference = $CFG->repository.substr($reference,1).'/imsmanifest.xml';
@@ -947,7 +946,6 @@ function scorm_check_package($data) {
 
     if (!empty($courseid) && !empty($reference)) {
         $externalpackage = scorm_external_link($reference);
-
         $validation->launch = 0;
         $referencefield = $reference;
         if (empty($reference)) {
@@ -962,12 +960,21 @@ function scorm_check_package($data) {
         } else if (!$externalpackage) {
             $reference = $CFG->dataroot.'/'.$courseid.'/'.$reference;
         }
-
         if (!empty($scormid)) {
         //
         // SCORM Update
         //
-            if ((!empty($validation)) && (is_file($reference) || $externalpackage)){
+            if (($data->unpackmethod == 'aiccdirect')) {
+                $validation->result = true;
+                $validation->pkgtype = 'AICC';
+                $validation->datadir = '';
+                if ($scorm = get_record('scorm','id',$scormid)) {
+                    if (($scorm->reference != $reference)) {
+                        $validation->launch = 0;
+                    }
+                }
+            }
+            else if ((!empty($validation)) && (is_file($reference) || $externalpackage)){
 
                 if (!$externalpackage) {
                     $mdcheck = md5_file($reference);
@@ -1016,7 +1023,12 @@ function scorm_check_package($data) {
             }
         }
         //$validation->launch = 0;
-        if (($validation != null) && ($validation->launch == 0)) {
+        if (($data->unpackmethod == 'aiccdirect')) {
+            $validation->result = true;
+            $validation->datadir = '';
+            $validation->pkgtype = 'AICC';
+        }
+        else if (($validation != null) && ($validation->launch == 0)) {
         //
         // Package must be validated
         //
diff --git a/mod/scorm/mod_form.php b/mod/scorm/mod_form.php
index 787ca27..cc5126f 100644
--- a/mod/scorm/mod_form.php
+++ b/mod/scorm/mod_form.php
@@ -39,6 +39,11 @@ class mod_scorm_mod_form extends moodleform_mod {
         $mform->addRule('reference', get_string('required'), 'required');
         $mform->setHelpButton('reference',array('package', get_string('package', 'scorm'), 'scorm'));
 
+        // Unpacking type - a direct activity or package with Manifest
+        $mform->addElement('select', 'unpackmethod', get_string('unpackmethod', 'scorm'), array('manifest' => get_string('manifest', 'scorm'), 'aiccdirect' => get_string('direct', 'scorm')));
+        $mform->setHelpButton('unpackmethod', array('unpackmethod',get_string('unpackmethod', 'scorm'), 'scorm'));
+        $mform->setAdvanced('unpackmethod');
+
 //-------------------------------------------------------------------------------
 // Other Settings
         $mform->addElement('header', 'advanced', get_string('othersettings', 'form'));
@@ -233,12 +238,31 @@ class mod_scorm_mod_form extends moodleform_mod {
             $default_values['completionscoredisabled'] = 1;
         }
 
+        // set default unpackmethod
+        if (!isset($default_values['unpackmethod']) || !strlen($default_values['unpackmethod'])) {
+            $default_values['unpackmethod'] = 'manifest';
+        }
+
     }
 
     function validation($data, $files) {
         $errors = parent::validation($data, $files);
 
-        $validate = scorm_validate($data);
+        $validate = (object) array('errors' => array(), 'result' => false);
+        // only validate the package if it is specified as type manifest
+        if (isset($data['unpackmethod']) && $data['unpackmethod'] == 'manifest') {
+            $validate = scorm_validate($data);
+        }
+        else {
+            // is this a valid URL for a reference
+            $clean = clean_param($data['reference'], PARAM_URL);
+            if (empty($clean)) {
+                $validate->errors['reference'] = get_string('invalidurl','scorm');
+            }
+            else {
+                $validate->result = true;
+            }
+        }
 
         if (!$validate->result) {
             $errors = $errors + $validate->errors;
diff --git a/mod/scorm/version.php b/mod/scorm/version.php
index c649cee..0a87f95 100755
--- a/mod/scorm/version.php
+++ b/mod/scorm/version.php
@@ -6,7 +6,7 @@
 /////////////////////////////////////////////////////////////////////////////////
 
 
-$module->version  = 2011041402;   // The (date) version of this module
+$module->version  = 2011041403;   // The (date) version of this module
 $module->requires = 2007101509;   // The version of Moodle that is required
 $module->cron     = 300;            // How often should cron check this module (seconds)?
 
