diff --git a/asdf.asd b/asdf.asd
index 5ac4e8c8d42d0b9b8536538f2e59906280487ae6..d5d2996cbe52f931e7af0b53286dafebfc6f2eb1 100644
--- a/asdf.asd
+++ b/asdf.asd
@@ -12,7 +12,7 @@
   :licence "MIT"
   :description "Another System Definition Facility"
   :long-description "ASDF builds Common Lisp software organized into defined systems."
-  :version "2.014.9" ;; to be automatically updated by bin/bump-revision
+  :version "2.014.10" ;; to be automatically updated by bin/bump-revision
   :depends-on ()
   :components
   ((:file "asdf")
diff --git a/asdf.lisp b/asdf.lisp
index c56716cfa70b1ac56a105323be07f4900169a0b1..b750efe27c5f8b3e6541b0cfbab925f44293afbb 100755
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,5 +1,5 @@
 ;;; -*- mode: common-lisp; Base: 10 ; Syntax: ANSI-Common-Lisp -*-
-;;; This is ASDF 2.014.9: Another System Definition Facility.
+;;; This is ASDF 2.014.10: Another System Definition Facility.
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome:
 ;;; please mail to <asdf-devel@common-lisp.net>.
@@ -58,7 +58,6 @@
     (make-package :asdf :use '(:common-lisp)))
   ;;; Implementation-dependent tweaks
   ;; (declaim (optimize (speed 2) (debug 2) (safety 3))) ; NO: rely on the implementation defaults.
-  (declaim (optimize (speed 2) (debug 3) (safety 3))) ; XXXXX debug only
   #+allegro
   (setf excl::*autoload-package-name-alist*
         (remove "asdf" excl::*autoload-package-name-alist*
@@ -101,7 +100,7 @@
          ;; "2.345.6" would be a development version in the official upstream
          ;; "2.345.0.7" would be your seventh local modification of official release 2.345
          ;; "2.345.6.7" would be your seventh local modification of development version 2.345.6
-         (asdf-version "2.014.9")
+         (asdf-version "2.014.10")
          (existing-asdf (fboundp 'find-system))
          (existing-version *asdf-version*)
          (already-there (equal asdf-version existing-version)))
@@ -1088,7 +1087,7 @@ processed in order by OPERATE."))
 (defclass component ()
   ((name :accessor component-name :initarg :name :type string :documentation
          "Component name: designator for a string composed of portable pathname characters")
-   (version :accessor component-version :initarg :version :type string)
+   (version :accessor component-version :initarg :version) ;; :type string -- not until we fix all systems that don't use it correctly!
    (description :accessor component-description :initarg :description)
    (long-description :accessor component-long-description :initarg :long-description)
    ;; This one below is used by POIU - http://www.cliki.net/poiu
@@ -1264,11 +1263,13 @@ processed in order by OPERATE."))
   "Parse a version string as a series of natural integers separated by dots.
 Return a (non-null) list of integers if the string is valid, NIL otherwise.
 NB: ignores leading zeroes, and so doesn't distinguish between 2.003 and 2.3"
-  (and (loop :for prev = nil :then c :for c :across string
-         :always (or (digit-char-p c)
-                     (and (eql c #\.) prev (not (eql prev #\.))))
-         :finally (return (and c (digit-char-p c))))
-       (mapcar #'parse-integer (split-string string :separator "."))))
+  (and
+   (stringp string)
+   (loop :for prev = nil :then c :for c :across string
+     :always (or (digit-char-p c)
+                 (and (eql c #\.) prev (not (eql prev #\.))))
+     :finally (return (and c (digit-char-p c))))
+   (mapcar #'parse-integer (split-string string :separator "."))))
 
 (defmethod version-satisfies ((cver string) version)
   (let ((x (parse-version cver))
@@ -2530,6 +2531,7 @@ Returns the new tree (which probably shares structure with the old one)"
               perform explain output-files operation-done-p
               weakly-depends-on
               depends-on serial in-order-to
+              (version nil versionp)
               ;; list ends
               &allow-other-keys) options
     (declare (ignorable perform explain output-files operation-done-p))
@@ -2543,6 +2545,11 @@ Returns the new tree (which probably shares structure with the old one)"
                        (class-for-type parent type))))
       (error 'duplicate-names :name name))
 
+    (when versionp
+      (unless (parse-version version)
+        (warn (compatfmt "~@<Invalid version ~S for component ~S~@[ of ~S~]~@:>")
+              version name parent)))
+
     (let* ((other-args (remove-keys
                         '(components pathname default-component-class
                           perform explain output-files operation-done-p