    Details of the returned function can be found here:
 
        http://api.jqueryui.com/draggable/#event-start"
-  [moduleCode lessonType lessonGroup]
-  (let []
-    (fn [evt ui])
-    )
-  )
+  [moduleCode lessonType selectedLessonGroup bgColorCssClass]
+  (fn [evt ui]
+    (let [ModulesMap         (aget js/window "ModulesMap")
+          ; Get all lesson groups
+          allLessonGroupsMap (get-in ModulesMap [moduleCode "lessons"
+                                                 lessonType])
+          ; Exclude the selected lesson group
+          unselectedLessonGroupsMap
+          (dissoc allLessonGroupsMap selectedLessonGroup)
+          ; Add all the <div> elements
+          augmentedTTLessonInfoSeq
+          (doall
+            (map (fn [[lessonGroup _]]
+                   (add-module-lesson-group moduleCode lessonType lessonGroup
+                                            bgColorCssClass false))
+                 unselectedLessonGroupsMap))])))
+
+; TODO: Make lesson type with only a single lessongroup non-draggable
+(defn- make-added-lessons-draggable
+  "Makes the <div> elements of selected lessons draggable."
+  [$divElemSeq moduleCode lessonType lessonLabel bgColorCssClass]
+  ; And Drag event handler
+  (doseq [$divElem $divElemSeq]
+    (.draggable $divElem
+                (js-obj "zIndex" 100
+                        ; TODO: Replace this `revert` function with one
+                        ;       which detects whether a revert should
+                        ;       occur
+                        "revert" (fn [] true)
+                        "start"  (lesson-draggable-start-evt-handler-maker
+                                   moduleCode lessonType lessonLabel
+                                   bgColorCssClass)))))
 
 (defn- add-module-lesson-group
-  "Adds a lesson group of a module to the timetable."
-  [moduleCode lessonType lessonLabel bgColorCssClass
+  "Adds a lesson group of a module to the timetable.
+
+   The `isActuallySelected?` param is used to indicate if the current lesson
+   group is selected by the user.
+   A value of `true` indicates that the user actually selected the lesson group.
+   A value of `false` indicates that the current lesson group is added by the
+   `lesson-draggable-start-evt-handler-maker` function and is not selected by
+   the user.
+
+   Returns a sequence of `ModulesSelectedLessonInfo` objects each augmented
+   with the `:divElem`, `:moduleCode`, `:lessonType`, `:lessonGroup` keys."
+  [moduleCode lessonType lessonLabel bgColorCssClass isActuallySelected?
    & {:keys [ModulesMap]
       :or   {ModulesMap (aget js/window "ModulesMap")}}]
   (let [moduleName          (get-in ModulesMap [moduleCode "name"])
         modulesMapLessonSeq (get-in ModulesMap [moduleCode "lessons" lessonType
                                                 lessonLabel])]
     (if (and moduleName modulesMapLessonSeq)
-        (let [augLessonInfoSeq (map (fn [modulesMapLesson]
-                                      (add-module-lesson moduleCode
-                                                         moduleName
-                                                         lessonType
-                                                         lessonLabel
-                                                         modulesMapLesson
-                                                         bgColorCssClass))
-                                    modulesMapLessonSeq)
-              lessonInfoSeq    (doall (map #(dissoc %1 :divElem)
-                                           augLessonInfoSeq))
-              $divElemSeq      (map #(:divElem %1) augLessonInfoSeq)]
-          ; Update ModulesSelected with the lesson group
-          (set! ModulesSelected
-                (assoc-in ModulesSelected [moduleCode lessonType]
-                          {:label lessonLabel, :info lessonInfoSeq}))
-
-          ; Add to ModulesSelectedOrder
-          (if (not-any? #{moduleCode} ModulesSelectedOrder)
+        (let [augLessonInfoSeq
+              (doall (map (fn [modulesMapLesson]
+                            (add-module-lesson moduleCode moduleName
+                                                          lessonType
+                                                          lessonLabel
+                                                          modulesMapLesson
+                                                          bgColorCssClass
+                                                          isActuallySelected?))
+                                    modulesMapLessonSeq))
+              lessonInfoSeq (map #(dissoc %1 :divElem :moduleCode :lessonType
+                                          :lessonGroup)
+                                 augLessonInfoSeq)
+              $divElemSeq   (map #(:divElem %1) augLessonInfoSeq)]
+
+          (if isActuallySelected?
               (do
-                (set! ModulesSelectedOrder
-                      (conj ModulesSelectedOrder moduleCode))
-                ; Update select2 box.
-                ; NOTE: This does a quadratic amount of work but I do not have
-                ;       a workaround.
-                (select2/select2-box-set-val
-                  select2/$Select2-Box
-                  (get-selected-module-codes-as-js-array))))
-
-          ; And Drag event handler
-          (doseq [$divElem $divElemSeq]
-            (.draggable $divElem
-                        (js-obj
-                          "zIndex" 100
-                          ; TODO: Replace this `revert` function
-                          "revert" (fn [] true)
-                          "start"  (lesson-draggable-start-evt-handler-maker
-                                     moduleCode lessonType lessonLabel)
-                                )))))))
+                ; Update ModulesSelected with the lesson group
+                (set! ModulesSelected
+                      (assoc-in ModulesSelected [moduleCode lessonType]
+                                {:label lessonLabel, :info lessonInfoSeq}))
+  
+                ; Add to ModulesSelectedOrder
+                (if (not-any? #{moduleCode} ModulesSelectedOrder)
+                    (do
+                      (set! ModulesSelectedOrder
+                            (conj ModulesSelectedOrder moduleCode))
+                      ; Update select2 box.
+                      ; NOTE: This does a quadratic amount of work but I do not
+                      ;       have a workaround.
+                      (select2/select2-box-set-val
+                        select2/$Select2-Box
+                        (get-selected-module-codes-as-js-array))))
+
+                (make-added-lessons-draggable $divElemSeq moduleCode lessonType
+                                              lessonLabel bgColorCssClass)
+                augLessonInfoSeq))))))
 
 (defn add-module
   "Adds a module to the timetable.

        (add-module-lesson-group moduleCode
                                 (:lessonType modInfo)
                                 (:lessonGroup modInfo)
                                 bgColorCssClass)))

    ; Update url hash
    (set-document-location-hash-based-on-modules-order)))

                                   (:lessonType moduleInfo)
                                   (:lessonGroup moduleInfo)
                                   bgColorCssClass
                                   true
                                   ModulesMap))

        ; Update URL hash with newly added module
