diff --git a/1.0/404.html b/1.0/404.html
index c8db87e..54a5408 100644
--- a/1.0/404.html
+++ b/1.0/404.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-overview.html b/1.0/architecture-overview.html
index 528bf39..9a26597 100644
--- a/1.0/architecture-overview.html
+++ b/1.0/architecture-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-concierge.html b/1.0/architecture-services-concierge.html
index 08bc46b..c07d345 100644
--- a/1.0/architecture-services-concierge.html
+++ b/1.0/architecture-services-concierge.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-connectivity.html b/1.0/architecture-services-connectivity.html
index 0acee68..a28c9f6 100644
--- a/1.0/architecture-services-connectivity.html
+++ b/1.0/architecture-services-connectivity.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-gateway.html b/1.0/architecture-services-gateway.html
index 14b79f4..a525333 100644
--- a/1.0/architecture-services-gateway.html
+++ b/1.0/architecture-services-gateway.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-policies.html b/1.0/architecture-services-policies.html
index e272fe2..49ed181 100644
--- a/1.0/architecture-services-policies.html
+++ b/1.0/architecture-services-policies.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-things-search.html b/1.0/architecture-services-things-search.html
index b13b76b..9dc3338 100644
--- a/1.0/architecture-services-things-search.html
+++ b/1.0/architecture-services-things-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/architecture-services-things.html b/1.0/architecture-services-things.html
index c5c4adc..163be80 100644
--- a/1.0/architecture-services-things.html
+++ b/1.0/architecture-services-things.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-acknowledgements.html b/1.0/basic-acknowledgements.html
index de84fd4..a74b0e7 100644
--- a/1.0/basic-acknowledgements.html
+++ b/1.0/basic-acknowledgements.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-acl.html b/1.0/basic-acl.html
index 30dad76..bad022b 100644
--- a/1.0/basic-acl.html
+++ b/1.0/basic-acl.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-apis.html b/1.0/basic-apis.html
index 433a755..fb00c83 100644
--- a/1.0/basic-apis.html
+++ b/1.0/basic-apis.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-auth.html b/1.0/basic-auth.html
index c3fe24e..b5447c2 100644
--- a/1.0/basic-auth.html
+++ b/1.0/basic-auth.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-changenotifications.html b/1.0/basic-changenotifications.html
index e83507a..266f604 100644
--- a/1.0/basic-changenotifications.html
+++ b/1.0/basic-changenotifications.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-connections.html b/1.0/basic-connections.html
index a1e6aa9..09ed593 100644
--- a/1.0/basic-connections.html
+++ b/1.0/basic-connections.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-enrichment.html b/1.0/basic-enrichment.html
index 9309d70..e73f52b 100644
--- a/1.0/basic-enrichment.html
+++ b/1.0/basic-enrichment.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-feature.html b/1.0/basic-feature.html
index 8d8b2ad..8642d69 100644
--- a/1.0/basic-feature.html
+++ b/1.0/basic-feature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-messages.html b/1.0/basic-messages.html
index 24163c3..feafb88 100644
--- a/1.0/basic-messages.html
+++ b/1.0/basic-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-namespaces-and-names.html b/1.0/basic-namespaces-and-names.html
index 8cbef77..0ce34f4 100644
--- a/1.0/basic-namespaces-and-names.html
+++ b/1.0/basic-namespaces-and-names.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-overview.html b/1.0/basic-overview.html
index 56d61d2..83941d7 100644
--- a/1.0/basic-overview.html
+++ b/1.0/basic-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-placeholders.html b/1.0/basic-placeholders.html
index 9a5f01a..59741f6 100644
--- a/1.0/basic-placeholders.html
+++ b/1.0/basic-placeholders.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-policy.html b/1.0/basic-policy.html
index 29e3b7d..9a1f9ef 100644
--- a/1.0/basic-policy.html
+++ b/1.0/basic-policy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-rql.html b/1.0/basic-rql.html
index 5c175f6..1662f37 100644
--- a/1.0/basic-rql.html
+++ b/1.0/basic-rql.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-search.html b/1.0/basic-search.html
index dd3c5b9..d018228 100644
--- a/1.0/basic-search.html
+++ b/1.0/basic-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-signals-command.html b/1.0/basic-signals-command.html
index 8727b74..21ac28b 100644
--- a/1.0/basic-signals-command.html
+++ b/1.0/basic-signals-command.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-signals-commandresponse.html b/1.0/basic-signals-commandresponse.html
index db0c08e..c289b50 100644
--- a/1.0/basic-signals-commandresponse.html
+++ b/1.0/basic-signals-commandresponse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-signals-errorresponse.html b/1.0/basic-signals-errorresponse.html
index f1159f0..a1fa4a2 100644
--- a/1.0/basic-signals-errorresponse.html
+++ b/1.0/basic-signals-errorresponse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-signals-event.html b/1.0/basic-signals-event.html
index ba4c866..c8019ba 100644
--- a/1.0/basic-signals-event.html
+++ b/1.0/basic-signals-event.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-signals.html b/1.0/basic-signals.html
index 6eff96e..7198b1a 100644
--- a/1.0/basic-signals.html
+++ b/1.0/basic-signals.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/basic-thing.html b/1.0/basic-thing.html
index 78b0169..66edde0 100644
--- a/1.0/basic-thing.html
+++ b/1.0/basic-thing.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/client-sdk-java.html b/1.0/client-sdk-java.html
index 313e41b..fddee5a 100644
--- a/1.0/client-sdk-java.html
+++ b/1.0/client-sdk-java.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/client-sdk-javascript.html b/1.0/client-sdk-javascript.html
index 5edc3b7..b66a9c0 100644
--- a/1.0/client-sdk-javascript.html
+++ b/1.0/client-sdk-javascript.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/client-sdk-overview.html b/1.0/client-sdk-overview.html
index 86957e4..a4f9b22 100644
--- a/1.0/client-sdk-overview.html
+++ b/1.0/client-sdk-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-header-mapping.html b/1.0/connectivity-header-mapping.html
index 05edc84..4372796 100644
--- a/1.0/connectivity-header-mapping.html
+++ b/1.0/connectivity-header-mapping.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-manage-connections.html b/1.0/connectivity-manage-connections.html
index 8c47e70..61f4b71 100644
--- a/1.0/connectivity-manage-connections.html
+++ b/1.0/connectivity-manage-connections.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-mapping.html b/1.0/connectivity-mapping.html
index a13a9c8..fad0eba 100644
--- a/1.0/connectivity-mapping.html
+++ b/1.0/connectivity-mapping.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-overview.html b/1.0/connectivity-overview.html
index d67eadd..dbd1d8e 100644
--- a/1.0/connectivity-overview.html
+++ b/1.0/connectivity-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-amqp091.html b/1.0/connectivity-protocol-bindings-amqp091.html
index 1894152..fd279ea 100644
--- a/1.0/connectivity-protocol-bindings-amqp091.html
+++ b/1.0/connectivity-protocol-bindings-amqp091.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-amqp10.html b/1.0/connectivity-protocol-bindings-amqp10.html
index a8cd4f1..b1fd5f4 100644
--- a/1.0/connectivity-protocol-bindings-amqp10.html
+++ b/1.0/connectivity-protocol-bindings-amqp10.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-http.html b/1.0/connectivity-protocol-bindings-http.html
index 982da5b..4dfdd8f 100644
--- a/1.0/connectivity-protocol-bindings-http.html
+++ b/1.0/connectivity-protocol-bindings-http.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-kafka2.html b/1.0/connectivity-protocol-bindings-kafka2.html
index b73cad0..316222d 100644
--- a/1.0/connectivity-protocol-bindings-kafka2.html
+++ b/1.0/connectivity-protocol-bindings-kafka2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-mqtt.html b/1.0/connectivity-protocol-bindings-mqtt.html
index 78f75e8..9876b90 100644
--- a/1.0/connectivity-protocol-bindings-mqtt.html
+++ b/1.0/connectivity-protocol-bindings-mqtt.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-protocol-bindings-mqtt5.html b/1.0/connectivity-protocol-bindings-mqtt5.html
index b56df1c..fbe78e7 100644
--- a/1.0/connectivity-protocol-bindings-mqtt5.html
+++ b/1.0/connectivity-protocol-bindings-mqtt5.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/connectivity-tls-certificates.html b/1.0/connectivity-tls-certificates.html
index fd7ee93..f6e445e 100644
--- a/1.0/connectivity-tls-certificates.html
+++ b/1.0/connectivity-tls-certificates.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/feedback.html b/1.0/feedback.html
index dc5c52c..6869e74 100644
--- a/1.0/feedback.html
+++ b/1.0/feedback.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/glossary.html b/1.0/glossary.html
index aaa2cbe..a9902a3 100644
--- a/1.0/glossary.html
+++ b/1.0/glossary.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-concepts.html b/1.0/httpapi-concepts.html
index 4507e8a..bb82c4c 100644
--- a/1.0/httpapi-concepts.html
+++ b/1.0/httpapi-concepts.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-messages.html b/1.0/httpapi-messages.html
index 764b153..e483ce9 100644
--- a/1.0/httpapi-messages.html
+++ b/1.0/httpapi-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-overview.html b/1.0/httpapi-overview.html
index 345f459..a84a518 100644
--- a/1.0/httpapi-overview.html
+++ b/1.0/httpapi-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-postman.html b/1.0/httpapi-postman.html
deleted file mode 100644
index 6ea265a..0000000
--- a/1.0/httpapi-postman.html
+++ /dev/null
@@ -1,1319 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<meta name="description" content="">
-<meta name="keywords" content="http,  api, http, REST, postman, explore">
-<title>  HTTP API Run in Postman • Eclipse Ditto • a digital twin framework</title>
-
-<link rel="stylesheet" href="css/syntax.css">
-<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">
-<link rel="stylesheet" href="css/modern-business.css">
-<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous">
-<link rel="stylesheet" href="css/customstyles.css">
-<link rel="stylesheet" href="css/boxshadowproperties.css">
-<link rel="stylesheet" href="css/theme-ditto.css">
-<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700">
-
-<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js" crossorigin="anonymous"></script>
-<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
-<script src="//cdnjs.cloudflare.com/ajax/libs/anchor-js/2.0.0/anchor.min.js" crossorigin="anonymous"></script>
-<script src="js/toc.js"></script>
-<script src="js/customscripts.js"></script>
-
-<script type="application/ld+json">
-{
-  "@context": "http://schema.org",
-  "@type": "Organization",
-  "url": "https://eclipse.org/ditto/",
-  "logo": "https://eclipse.org/ditto/images/ditto.svg"
-}
-</script>
-
-<link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16">
-<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32">
-<link rel="icon" type="image/png" href="images/favicon-96x96.png" sizes="96x96">
-
-<link rel="alternate" type="application/rss+xml" title="Eclipse Ditto Blog" href="https://www.eclipse.org/ditto/feed.xml">
-
-<!-- Eclipse Foundation cookie consent: -->
-<link rel="stylesheet" type="text/css" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css" />
-<script src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script>
-
-    <script>
-        $(document).ready(function() {
-            $("#tg-sb-link").click(function() {
-                $("#tg-sb-sidebar").toggle();
-                $("#tg-sb-content").toggleClass('col-md-9');
-                $("#tg-sb-content").toggleClass('col-md-12');
-                $("#tg-sb-icon").toggleClass('fa-toggle-on');
-                $("#tg-sb-icon").toggleClass('fa-toggle-off');
-            });
-        });
-    </script>
-</head>
-
-
-<script>
-    (function(w,d,s,l,i){
-        w[l]=w[l]||[];
-        w[l].push({'gtm.start':
-            new Date().getTime(),event:'gtm.js'});
-        var f=d.getElementsByTagName(s)[0],
-            j=d.createElement(s),
-            dl=l!='dataLayer'?'&l='+l:'';
-        j.async=true;
-        j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
-        f.parentNode.insertBefore(j,f);
-    })(window,document,'script','dataLayer','GTM-5WLCZXC');
-</script>
-
-
-
-<body>
-<!-- Navigation -->
-<nav class="navbar navbar-inverse navbar-fixed-top">
-    <div class="container topnavlinks">
-        <div class="navbar-header">
-            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
-                <span class="sr-only">Toggle navigation</span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-            </button>
-            <a class="navbar-ditto-home" href="index.html">&nbsp;<img src="images/ditto_allwhite_symbolonly.svg" class="ditto-navbar-symbol" alt="Home"> <img src="images/ditto_allwhite_textonly.svg" class="ditto-navbar-symbol-text" alt="Ditto"></a>
-        </div>
-        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-            <ul class="nav navbar-nav navbar-right">
-                <!-- toggle sidebar button -->
-                <!--<li><a id="tg-sb-link" href="#"><i id="tg-sb-icon" class="fa fa-toggle-on"></i> Nav</a></li>-->
-                <!-- entries without drop-downs appear here -->
-
-
-
-
-                
-                
-                
-                <li><a href="blog.html">Blog</a></li>
-                
-                
-                
-                <li><a href="intro-overview.html">Documentation</a></li>
-                
-                
-                
-                <li><a href="http-api-doc.html">HTTP API</a></li>
-                
-                
-                
-                <li><a href="https://ditto.eclipse.org" target="_blank">Sandbox</a></li>
-                
-                
-                
-                <li><a href="https://github.com/eclipse/ditto" target="_blank">GitHub</a></li>
-                
-                
-                
-                <li><a href="https://github.com/eclipse/ditto-examples" target="_blank">GitHub examples</a></li>
-                
-                
-                
-                <!-- entries with drop-downs appear here -->
-                <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
-                
-                
-                <li class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Links<b class="caret"></b></a>
-                    <ul class="dropdown-menu">
-                        
-                        
-                        <li><a href="https://projects.eclipse.org/projects/iot.ditto" target="_blank">Eclipse Ditto Project</a></li>
-                        
-                        
-                        
-                        <li><a href="https://www.eclipse.org/forums/index.php/f/364/" target="_blank">Forum</a></li>
-                        
-                        
-                        
-                        <li><a href="https://ci.eclipse.org/ditto/" target="_blank">Jenkins</a></li>
-                        
-                        
-                        
-                        <li><a href="https://dev.eclipse.org/mhonarc/lists/ditto-dev/" target="_blank">Mailing list archives</a></li>
-                        
-                        
-                        
-                        <li><a href="https://gitter.im/eclipse/ditto" target="_blank">Gitter.im chat</a></li>
-                        
-                        
-                    </ul>
-                </li>
-                
-                
-                
-                <!--comment out this block if you want to hide search-->
-                <li>
-                    <!--start search-->
-                    <div id="search-demo-container">
-                        <input type="text" id="search-input" placeholder="search...">
-                        <ul id="results-container"></ul>
-                    </div>
-                    <script src="//cdnjs.cloudflare.com/ajax/libs/simple-jekyll-search/0.0.9/jekyll-search.js" type="text/javascript"></script>
-                    <script type="text/javascript">
-                            SimpleJekyllSearch.init({
-                                searchInput: document.getElementById('search-input'),
-                                resultsContainer: document.getElementById('results-container'),
-                                dataSource: 'search.json',
-                                searchResultTemplate: '<li><a href="{url}" title="HTTP API Run in Postman">{title}</a></li>',
-                                noResultsText: 'No results found.',
-                                limit: 10,
-                                fuzzy: true,
-                    })
-                    </script>
-                    <!--end search-->
-                </li>
-            </ul>
-        </div>
-    </div>
-    <!-- /.container -->
-</nav>
-
-<!-- Page Content -->
-<div class="container">
-  <div id="main">
-    <!-- Content Row -->
-    <div class="row">
-        
-        
-            <!-- Sidebar Column -->
-            <div class="col-md-3" id="tg-sb-sidebar">
-                
-
-<ul id="mysidebar" class="nav">
-  <li class="sidebarTitle">
-    <label for="docVersion">Eclipse Ditto  version:</label>
-    <div class="select-wrapper">
-      <select id="docVersion" name="docVersion">
-        
-        <option value="">development</option>
-        
-        <option value="1.0">1.0</option>
-        
-        <option value="1.1">1.1</option>
-        
-      </select>
-    </div>
-    <div id="dev-warning">
-      <div markdown="span" class="alert alert-warning" role="alert" style="font-size:0.6em"><i class="fa fa-warning"></i> <b>Important:</b> This documentation reflects the latest 'development'. You might want to choose a released version.</div>
-    </div>
-  </li>
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Introduction</a>
-          <ul>
-              
-              
-              
-              <li><a href="intro-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="intro-digitaltwins.html">Digital twins</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="intro-hello-world.html">Hello world</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Release Notes</a>
-          <ul>
-              
-              
-              
-              <li><a href="release_notes_100.html">1.0.0</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="release_notes_090.html">0.9.0</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="release_notes_080.html">0.8.0</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Milestone releases</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="release_notes_100-M2.html">1.0.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_100-M1a.html">1.0.0-M1a</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_090-M2.html">0.9.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_090-M1.html">0.9.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M3.html">0.8.0-M3</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M2.html">0.8.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M1.html">0.8.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_030-M2.html">0.3.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_030-M1.html">0.3.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_020-M1.html">0.2.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_010-M3.html">0.1.0-M3</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_010-M1.html">0.1.0-M1</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Installation</a>
-          <ul>
-              
-              
-              
-              <li><a href="installation-building.html">Building Ditto</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="installation-running.html">Running Ditto</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="installation-operating.html">Operating Ditto</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Basic concepts</a>
-          <ul>
-              
-              
-              
-              <li><a href="basic-overview.html">Overview</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Model entities</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="basic-thing.html">Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-acl.html">Access Control List (ACL)</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-feature.html">Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-policy.html">Policy</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-namespaces-and-names.html">Namespaces and Names</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-auth.html">Authentication and Authorization</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-messages.html">Messages</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-signals.html">Signals</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Signal types</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="basic-signals-command.html">Command</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-commandresponse.html">Command response</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-errorresponse.html">Error response</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-event.html">Event</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-apis.html">APIs</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-connections.html">Connections</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-placeholders.html">Placeholders</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-changenotifications.html">Change notifications</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-rql.html">RQL expressions</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-search.html">Search</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Architecture</a>
-          <ul>
-              
-              
-              
-              <li><a href="architecture-overview.html">Overview</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Services</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="architecture-services-policies.html">Policies</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-things.html">Things</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-things-search.html">Things-Search</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-connectivity.html">Connectivity</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-concierge.html">Concierge</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-gateway.html">Gateway</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>HTTP API</a>
-          <ul>
-              
-              
-              
-              <li><a href="httpapi-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-concepts.html">Concepts</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-search.html">Search</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-messages.html">Messages</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-protocol-bindings-websocket.html">WebSocket protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-sse.html">Server sent events</a></li>
-              
-              
-              
-              
-              
-              
-              <li class="active"><a href="httpapi-postman.html">Run in Postman</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Connectivity API</a>
-          <ul>
-              
-              
-              
-              <li><a href="connectivity-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-manage-connections.html">Manage connections</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-amqp091.html">AMQP 0.9.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-amqp10.html">AMQP 1.0 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-mqtt.html">MQTT 3.1.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-http.html">HTTP 1.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-kafka2.html">Kafka 2.x protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-mapping.html">Payload mapping</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-header-mapping.html">Header mapping</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-tls-certificates.html">TLS certificates</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Client SDK</a>
-          <ul>
-              
-              
-              
-              <li><a href="client-sdk-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="client-sdk-java.html">Java</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="client-sdk-javascript.html">JavaScript</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Ditto Protocol</a>
-          <ul>
-              
-              
-              
-              <li><a href="protocol-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-twinlive.html">Twin/live channel</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification.html">Specification</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification-topic.html">Protocol topic</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification-things.html">Things group</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ commands/events</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-create-or-modify.html">Create/Modify</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-retrieve.html">Retrieve</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-delete.html">Delete</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ search/messages</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-search.html">Search</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-messages.html">Messages</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-bindings.html">Bindings</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-examples.html">Examples</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ Things examples</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-examples-creatething.html">Create a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletething.html">Delete a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifything.html">Modify a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievething.html">Retrieve a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievethings.html">Retrieve multiple Things</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createattributes.html">Create Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteattributes.html">Delete Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyattributes.html">Modify Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveattributes.html">Retrieve Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createattribute.html">Create a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteattribute.html">Delete a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyattribute.html">Modify a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveattribute.html">Retrieve a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createthingdefinition.html">Create a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletethingdefinition.html">Delete a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifythingdefinition.html">Modify a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievethingdefinition.html">Retrieve a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createfeatures.html">Create Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletefeatures.html">Delete Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyfeatures.html">Modify Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievefeatures.html">Retrieve Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createfeature.html">Create a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletefeature.html">Delete a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyfeature.html">Modify a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievefeature.html">Retrieve a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createdefinition.html">Create Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletedefinition.html">Delete Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifydefinition.html">Modify Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievedefinition.html">Retrieve Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createproperties.html">Create Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteproperties.html">Delete Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyproperties.html">Modify Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveproperties.html">Retrieve Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createproperty.html">Create a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteproperty.html">Delete a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyproperty.html">Modify a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveproperty.html">Retrieve a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-errorresponses.html">Error Responses</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-    <li><a href="sandbox.html">Sandbox</a></li>
-    
-  
-  
-  
-    
-    <li><a href="presentations.html">Presentations</a></li>
-    
-  
-  
-  
-    
-    <li><a href="glossary.html">Glossary</a></li>
-    
-  
-  
-  
-    
-    <li><a href="feedback.html">Feedback</a></li>
-    
-  
-  
-  
-    
-         <p class="external">
-             <a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a>
-         </p>
-    
-</ul>
-
-<!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
-<script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
-</script>
-
-            </div>
-            
-        
-
-        <!-- Content Column -->
-        <div class="col-md-9" id="tg-sb-content">
-            <div class="post-header">
-   <h1 class="post-title-main">HTTP API Run in Postman</h1>
-</div>
-
-
-
-<div class="post-content">
-
-   
-
-    
-    
-<!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
-<script>
-$( document ).ready(function() {
-  // Handler for .ready() called.
-
-$('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' });
-
-/* this offset helps account for the space taken up by the floating toolbar. */
-$('#toc').on('click', 'a', function() {
-  var target = $(this.getAttribute('href'))
-    , scroll_target = target.offset().top
-
-  $(window).scrollTop(scroll_target - 10);
-  return false
-})
-  
-});
-</script>
-
-<div id="toc"></div>
-
-    
-
-
-    
-
-
-    
-
-  <p>Use <a href="https://www.getpostman.com">Postman</a> and import the Ditto Postman collection which can be downloaded here:</p>
-<ul>
-  <li><a href="postman/Ditto.postman_collection.json">Ditto Postman collection</a></li>
-  <li><a href="postman/Ditto_Sandbox.postman_environment.json">Ditto Postman environment for sandbox</a></li>
-</ul>
-
-
-
-    <div class="tags">
-        
-        <b>Tags: </b>
-        
-        
-        
-        <a href="tag_http.html" class="btn btn-default navbar-btn cursorNorm" role="button">http</a>
-        
-        
-        
-    </div>
-
-</div>
-
-<hr class="shaded"/>
-
-<footer>
-            <div class="row">
-                <div class="col-lg-12 footer">
-                    <div class="logo">
-                        <a href="https://eclipse.org"><img src="images/eclipse_foundation_logo.svg" alt="Eclipse logo"/></a>
-                    </div>
-                    <p class="notice">
-                        &copy;2020 Eclipse Ditto.
-                         Site last generated: Jun 9, 2020 <br />
-                    </p>
-                    <div class="quickLinks">
-                        <a href="https://www.eclipse.org/legal/privacy.php" target="_blank">
-                            &gt; Privacy Policy
-                        </a>
-                        <a href="https://www.eclipse.org/legal/termsofuse.php" target="_blank">
-                            &gt; Terms of Use
-                        </a>
-                        <a href="https://www.eclipse.org/legal/copyright.php" target="_blank">
-                            &gt; Copyright Agent
-                        </a>
-                        <a href="https://www.eclipse.org/legal" target="_blank">
-                            &gt; Legal
-                        </a>
-                        <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">
-                            &gt; License
-                        </a>
-                        <a href="https://eclipse.org/security" target="_blank">
-                            &gt; Report a Vulnerability
-                        </a>
-                    </div>
-                </div>
-            </div>
-</footer>
-
-
-        </div>
-    <!-- /.row -->
-</div>
-<!-- /.container -->
-</div>
-<!-- /#main -->
-    </div>
-
-</body>
-</html>
diff --git a/1.0/httpapi-protocol-bindings-websocket.html b/1.0/httpapi-protocol-bindings-websocket.html
index dc480cb..606254f 100644
--- a/1.0/httpapi-protocol-bindings-websocket.html
+++ b/1.0/httpapi-protocol-bindings-websocket.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-search.html b/1.0/httpapi-search.html
index d3badbb..1054530 100644
--- a/1.0/httpapi-search.html
+++ b/1.0/httpapi-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/httpapi-sse.html b/1.0/httpapi-sse.html
index 96dc90b..c9daf2c 100644
--- a/1.0/httpapi-sse.html
+++ b/1.0/httpapi-sse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/installation-building.html b/1.0/installation-building.html
index 68bb5cb..2d68a1a 100644
--- a/1.0/installation-building.html
+++ b/1.0/installation-building.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/installation-operating.html b/1.0/installation-operating.html
index b731bab..43c7351 100644
--- a/1.0/installation-operating.html
+++ b/1.0/installation-operating.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/installation-running.html b/1.0/installation-running.html
index 1addfc2..d90a57c 100644
--- a/1.0/installation-running.html
+++ b/1.0/installation-running.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/intro-digitaltwins.html b/1.0/intro-digitaltwins.html
index a57f6d2..95b9b2b 100644
--- a/1.0/intro-digitaltwins.html
+++ b/1.0/intro-digitaltwins.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/intro-hello-world.html b/1.0/intro-hello-world.html
index 4d0a91b..c9d2f25 100644
--- a/1.0/intro-hello-world.html
+++ b/1.0/intro-hello-world.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/intro-overview.html b/1.0/intro-overview.html
index e463f0c..ec996ae 100644
--- a/1.0/intro-overview.html
+++ b/1.0/intro-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/js/customscripts.js b/1.0/js/customscripts.js
index 96aff54..c45cdb9 100644
--- a/1.0/js/customscripts.js
+++ b/1.0/js/customscripts.js
@@ -34,4 +34,46 @@
         });
 
     });
+
+    $("#dev-warning").hide();
+    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
+    $("#docVersion").change(changeSelectedDocVersion);
 });
+
+function changeSelectedDocVersionDropdownSelection(element) {
+    var pathName = window.location.pathname;
+
+    var versionOptions = element.options;
+    for (var i = 0; i < versionOptions.length; i++) {
+        var versionValue = versionOptions[i].value;
+        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
+            $("#docVersion").val(versionValue).change();
+            return;
+        }
+    }
+    // fallback: dev with "empty" version value:
+    $("#docVersion").val("").change();
+    $("#dev-warning").show();
+}
+
+function changeSelectedDocVersion() {
+    var versionValue = $('#docVersion').val();
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
+    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
+    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
+    if (versionValue === "" && !versionMatch) {
+        // do nothing, we're already on the correct "dev" version
+    } else if (versionMatch && (versionValue === versionMatch[1])) {
+        // do nothing, we're already on the correct version
+    } else {
+        if (versionValue === "" && versionMatch) {
+            window.location.pathname = "ditto/" + versionMatch[2];
+        } else if (versionValue === "") {
+            window.location.pathname = "ditto/" + remainingPath;
+        } else if (versionMatch) {
+            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
+        } else {
+            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
+        }
+    }
+}
diff --git a/1.0/presentations.html b/1.0/presentations.html
index 9545cd3..d976774 100644
--- a/1.0/presentations.html
+++ b/1.0/presentations.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-bindings.html b/1.0/protocol-bindings.html
index f0dc701..2a69da7 100644
--- a/1.0/protocol-bindings.html
+++ b/1.0/protocol-bindings.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createattribute.html b/1.0/protocol-examples-createattribute.html
index 042c38a..ddec1fc 100644
--- a/1.0/protocol-examples-createattribute.html
+++ b/1.0/protocol-examples-createattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createattributes.html b/1.0/protocol-examples-createattributes.html
index ed5ecb9..8a59c6e 100644
--- a/1.0/protocol-examples-createattributes.html
+++ b/1.0/protocol-examples-createattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createdefinition.html b/1.0/protocol-examples-createdefinition.html
index ae2d758..7ae3220 100644
--- a/1.0/protocol-examples-createdefinition.html
+++ b/1.0/protocol-examples-createdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createfeature.html b/1.0/protocol-examples-createfeature.html
index 967488b..3a87b68 100644
--- a/1.0/protocol-examples-createfeature.html
+++ b/1.0/protocol-examples-createfeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createfeatures.html b/1.0/protocol-examples-createfeatures.html
index c4695cc..20c8c80 100644
--- a/1.0/protocol-examples-createfeatures.html
+++ b/1.0/protocol-examples-createfeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createproperties.html b/1.0/protocol-examples-createproperties.html
index 333e2dc..8699e94 100644
--- a/1.0/protocol-examples-createproperties.html
+++ b/1.0/protocol-examples-createproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createproperty.html b/1.0/protocol-examples-createproperty.html
index 53102e9..9174636 100644
--- a/1.0/protocol-examples-createproperty.html
+++ b/1.0/protocol-examples-createproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-creatething.html b/1.0/protocol-examples-creatething.html
index 37f9f85..77162bd 100644
--- a/1.0/protocol-examples-creatething.html
+++ b/1.0/protocol-examples-creatething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-createthingdefinition.html b/1.0/protocol-examples-createthingdefinition.html
index 15c44c7..cae5409 100644
--- a/1.0/protocol-examples-createthingdefinition.html
+++ b/1.0/protocol-examples-createthingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deleteattribute.html b/1.0/protocol-examples-deleteattribute.html
index a8d2b3f..208ad80 100644
--- a/1.0/protocol-examples-deleteattribute.html
+++ b/1.0/protocol-examples-deleteattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deleteattributes.html b/1.0/protocol-examples-deleteattributes.html
index 2de0837..d6c5872 100644
--- a/1.0/protocol-examples-deleteattributes.html
+++ b/1.0/protocol-examples-deleteattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deletedefinition.html b/1.0/protocol-examples-deletedefinition.html
index 3ac5113..88af952 100644
--- a/1.0/protocol-examples-deletedefinition.html
+++ b/1.0/protocol-examples-deletedefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deletefeature.html b/1.0/protocol-examples-deletefeature.html
index 5ab753e..9e71b71 100644
--- a/1.0/protocol-examples-deletefeature.html
+++ b/1.0/protocol-examples-deletefeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deletefeatures.html b/1.0/protocol-examples-deletefeatures.html
index 3f8984f..ff3f773 100644
--- a/1.0/protocol-examples-deletefeatures.html
+++ b/1.0/protocol-examples-deletefeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deleteproperties.html b/1.0/protocol-examples-deleteproperties.html
index 5785ae1..db9c745 100644
--- a/1.0/protocol-examples-deleteproperties.html
+++ b/1.0/protocol-examples-deleteproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deleteproperty.html b/1.0/protocol-examples-deleteproperty.html
index ecef497..7e843ea 100644
--- a/1.0/protocol-examples-deleteproperty.html
+++ b/1.0/protocol-examples-deleteproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deletething.html b/1.0/protocol-examples-deletething.html
index 438a780..b8c40a9 100644
--- a/1.0/protocol-examples-deletething.html
+++ b/1.0/protocol-examples-deletething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-deletethingdefinition.html b/1.0/protocol-examples-deletethingdefinition.html
index f57f6be..2c811be 100644
--- a/1.0/protocol-examples-deletethingdefinition.html
+++ b/1.0/protocol-examples-deletethingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-errorresponses.html b/1.0/protocol-examples-errorresponses.html
index 87641bf..0b8c1b9 100644
--- a/1.0/protocol-examples-errorresponses.html
+++ b/1.0/protocol-examples-errorresponses.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyattribute.html b/1.0/protocol-examples-modifyattribute.html
index 857db7d..4e8c777 100644
--- a/1.0/protocol-examples-modifyattribute.html
+++ b/1.0/protocol-examples-modifyattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyattributes.html b/1.0/protocol-examples-modifyattributes.html
index 1d6be3c..b333318 100644
--- a/1.0/protocol-examples-modifyattributes.html
+++ b/1.0/protocol-examples-modifyattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifydefinition.html b/1.0/protocol-examples-modifydefinition.html
index 0fa9e03..dc95b86 100644
--- a/1.0/protocol-examples-modifydefinition.html
+++ b/1.0/protocol-examples-modifydefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyfeature.html b/1.0/protocol-examples-modifyfeature.html
index 52d6331..5123047 100644
--- a/1.0/protocol-examples-modifyfeature.html
+++ b/1.0/protocol-examples-modifyfeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyfeatures.html b/1.0/protocol-examples-modifyfeatures.html
index 5664d3d..87d4093 100644
--- a/1.0/protocol-examples-modifyfeatures.html
+++ b/1.0/protocol-examples-modifyfeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifypolicyid.html b/1.0/protocol-examples-modifypolicyid.html
index ab54b91..e589e84 100644
--- a/1.0/protocol-examples-modifypolicyid.html
+++ b/1.0/protocol-examples-modifypolicyid.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyproperties.html b/1.0/protocol-examples-modifyproperties.html
index 321ed19..cc465c4 100644
--- a/1.0/protocol-examples-modifyproperties.html
+++ b/1.0/protocol-examples-modifyproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifyproperty.html b/1.0/protocol-examples-modifyproperty.html
index 6b7bda3..1fb50c5 100644
--- a/1.0/protocol-examples-modifyproperty.html
+++ b/1.0/protocol-examples-modifyproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifything.html b/1.0/protocol-examples-modifything.html
index 91c2cfa..fde3280 100644
--- a/1.0/protocol-examples-modifything.html
+++ b/1.0/protocol-examples-modifything.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-modifythingdefinition.html b/1.0/protocol-examples-modifythingdefinition.html
index 8d6c621..1458667 100644
--- a/1.0/protocol-examples-modifythingdefinition.html
+++ b/1.0/protocol-examples-modifythingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-createpolicy.html b/1.0/protocol-examples-policies-createpolicy.html
index 2962d72..3a8d5bf 100644
--- a/1.0/protocol-examples-policies-createpolicy.html
+++ b/1.0/protocol-examples-policies-createpolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-createpolicyentry.html b/1.0/protocol-examples-policies-createpolicyentry.html
index 485bdea..6a647ad 100644
--- a/1.0/protocol-examples-policies-createpolicyentry.html
+++ b/1.0/protocol-examples-policies-createpolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-createresource.html b/1.0/protocol-examples-policies-createresource.html
index 82395dd..cf77d0f 100644
--- a/1.0/protocol-examples-policies-createresource.html
+++ b/1.0/protocol-examples-policies-createresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-createsubject.html b/1.0/protocol-examples-policies-createsubject.html
index 4668c71..c2ee88c 100644
--- a/1.0/protocol-examples-policies-createsubject.html
+++ b/1.0/protocol-examples-policies-createsubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-deletepolicy.html b/1.0/protocol-examples-policies-deletepolicy.html
index 3106f7e..dcd31d1 100644
--- a/1.0/protocol-examples-policies-deletepolicy.html
+++ b/1.0/protocol-examples-policies-deletepolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-deletepolicyentry.html b/1.0/protocol-examples-policies-deletepolicyentry.html
index 9d930e9..dc47009 100644
--- a/1.0/protocol-examples-policies-deletepolicyentry.html
+++ b/1.0/protocol-examples-policies-deletepolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-deleteresource.html b/1.0/protocol-examples-policies-deleteresource.html
index a14e7b0..3d39bb2 100644
--- a/1.0/protocol-examples-policies-deleteresource.html
+++ b/1.0/protocol-examples-policies-deleteresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-deletesubject.html b/1.0/protocol-examples-policies-deletesubject.html
index 877e6a9..9401740 100644
--- a/1.0/protocol-examples-policies-deletesubject.html
+++ b/1.0/protocol-examples-policies-deletesubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-errorresponses.html b/1.0/protocol-examples-policies-errorresponses.html
index 5ac5db1..a9f5cfb 100644
--- a/1.0/protocol-examples-policies-errorresponses.html
+++ b/1.0/protocol-examples-policies-errorresponses.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifypolicy.html b/1.0/protocol-examples-policies-modifypolicy.html
index 6868da4..1d4458b 100644
--- a/1.0/protocol-examples-policies-modifypolicy.html
+++ b/1.0/protocol-examples-policies-modifypolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifypolicyentries.html b/1.0/protocol-examples-policies-modifypolicyentries.html
index 305d2f7..211fc10 100644
--- a/1.0/protocol-examples-policies-modifypolicyentries.html
+++ b/1.0/protocol-examples-policies-modifypolicyentries.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifypolicyentry.html b/1.0/protocol-examples-policies-modifypolicyentry.html
index 2d3d33c..8d86322 100644
--- a/1.0/protocol-examples-policies-modifypolicyentry.html
+++ b/1.0/protocol-examples-policies-modifypolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifyresource.html b/1.0/protocol-examples-policies-modifyresource.html
index 9fdeebb..a12356b 100644
--- a/1.0/protocol-examples-policies-modifyresource.html
+++ b/1.0/protocol-examples-policies-modifyresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifyresources.html b/1.0/protocol-examples-policies-modifyresources.html
index 8459ad5..60d205e 100644
--- a/1.0/protocol-examples-policies-modifyresources.html
+++ b/1.0/protocol-examples-policies-modifyresources.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifysubject.html b/1.0/protocol-examples-policies-modifysubject.html
index 862309b..ef2bd11 100644
--- a/1.0/protocol-examples-policies-modifysubject.html
+++ b/1.0/protocol-examples-policies-modifysubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-modifysubjects.html b/1.0/protocol-examples-policies-modifysubjects.html
index 93bf1c3..31ca833 100644
--- a/1.0/protocol-examples-policies-modifysubjects.html
+++ b/1.0/protocol-examples-policies-modifysubjects.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrievepolicy.html b/1.0/protocol-examples-policies-retrievepolicy.html
index f24013f..6754821 100644
--- a/1.0/protocol-examples-policies-retrievepolicy.html
+++ b/1.0/protocol-examples-policies-retrievepolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrievepolicyentries.html b/1.0/protocol-examples-policies-retrievepolicyentries.html
index a076daa..7c12f8e 100644
--- a/1.0/protocol-examples-policies-retrievepolicyentries.html
+++ b/1.0/protocol-examples-policies-retrievepolicyentries.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrievepolicyentry.html b/1.0/protocol-examples-policies-retrievepolicyentry.html
index 552fecd..b9389dc 100644
--- a/1.0/protocol-examples-policies-retrievepolicyentry.html
+++ b/1.0/protocol-examples-policies-retrievepolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrieveresource.html b/1.0/protocol-examples-policies-retrieveresource.html
index 5c61575..2220499 100644
--- a/1.0/protocol-examples-policies-retrieveresource.html
+++ b/1.0/protocol-examples-policies-retrieveresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrieveresources.html b/1.0/protocol-examples-policies-retrieveresources.html
index a25953b..59b6759 100644
--- a/1.0/protocol-examples-policies-retrieveresources.html
+++ b/1.0/protocol-examples-policies-retrieveresources.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrievesubject.html b/1.0/protocol-examples-policies-retrievesubject.html
index 1bf95db..e53b53d 100644
--- a/1.0/protocol-examples-policies-retrievesubject.html
+++ b/1.0/protocol-examples-policies-retrievesubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-policies-retrievesubjects.html b/1.0/protocol-examples-policies-retrievesubjects.html
index 1313f62..a12ae5a 100644
--- a/1.0/protocol-examples-policies-retrievesubjects.html
+++ b/1.0/protocol-examples-policies-retrievesubjects.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrieveattribute.html b/1.0/protocol-examples-retrieveattribute.html
index bda45d5..9b0b35f 100644
--- a/1.0/protocol-examples-retrieveattribute.html
+++ b/1.0/protocol-examples-retrieveattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrieveattributes.html b/1.0/protocol-examples-retrieveattributes.html
index 69f55e0..965c273 100644
--- a/1.0/protocol-examples-retrieveattributes.html
+++ b/1.0/protocol-examples-retrieveattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievedefinition.html b/1.0/protocol-examples-retrievedefinition.html
index 2c072fe..66a2c03 100644
--- a/1.0/protocol-examples-retrievedefinition.html
+++ b/1.0/protocol-examples-retrievedefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievefeature.html b/1.0/protocol-examples-retrievefeature.html
index 09285ba..a057b0e 100644
--- a/1.0/protocol-examples-retrievefeature.html
+++ b/1.0/protocol-examples-retrievefeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievefeatures.html b/1.0/protocol-examples-retrievefeatures.html
index f11def4..6badfab 100644
--- a/1.0/protocol-examples-retrievefeatures.html
+++ b/1.0/protocol-examples-retrievefeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrieveproperties.html b/1.0/protocol-examples-retrieveproperties.html
index a4713d6..c81643c 100644
--- a/1.0/protocol-examples-retrieveproperties.html
+++ b/1.0/protocol-examples-retrieveproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrieveproperty.html b/1.0/protocol-examples-retrieveproperty.html
index 5e9d87a..01b9c5e 100644
--- a/1.0/protocol-examples-retrieveproperty.html
+++ b/1.0/protocol-examples-retrieveproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievething.html b/1.0/protocol-examples-retrievething.html
index ead8480..4f99081 100644
--- a/1.0/protocol-examples-retrievething.html
+++ b/1.0/protocol-examples-retrievething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievethingdefinition.html b/1.0/protocol-examples-retrievethingdefinition.html
index dfa786c..8ff9ae2 100644
--- a/1.0/protocol-examples-retrievethingdefinition.html
+++ b/1.0/protocol-examples-retrievethingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-retrievethings.html b/1.0/protocol-examples-retrievethings.html
index 30198c9..cf16a09 100644
--- a/1.0/protocol-examples-retrievethings.html
+++ b/1.0/protocol-examples-retrievethings.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples-search.html b/1.0/protocol-examples-search.html
index 01aec3f..ff79df3 100644
--- a/1.0/protocol-examples-search.html
+++ b/1.0/protocol-examples-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-examples.html b/1.0/protocol-examples.html
index 60e14a6..2a4d67f 100644
--- a/1.0/protocol-examples.html
+++ b/1.0/protocol-examples.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-overview.html b/1.0/protocol-overview.html
index e5385a2..3c3ddf3 100644
--- a/1.0/protocol-overview.html
+++ b/1.0/protocol-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-acks.html b/1.0/protocol-specification-acks.html
index d9ac909..23cf832 100644
--- a/1.0/protocol-specification-acks.html
+++ b/1.0/protocol-specification-acks.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-policies-create-or-modify.html b/1.0/protocol-specification-policies-create-or-modify.html
index 32f4d31..d06afe8 100644
--- a/1.0/protocol-specification-policies-create-or-modify.html
+++ b/1.0/protocol-specification-policies-create-or-modify.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-policies-delete.html b/1.0/protocol-specification-policies-delete.html
index 176b862..db84ace 100644
--- a/1.0/protocol-specification-policies-delete.html
+++ b/1.0/protocol-specification-policies-delete.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-policies-retrieve.html b/1.0/protocol-specification-policies-retrieve.html
index c9dd0f0..2b1c0dc 100644
--- a/1.0/protocol-specification-policies-retrieve.html
+++ b/1.0/protocol-specification-policies-retrieve.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-policies.html b/1.0/protocol-specification-policies.html
index b3dbf41..ce28426 100644
--- a/1.0/protocol-specification-policies.html
+++ b/1.0/protocol-specification-policies.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things-create-or-modify.html b/1.0/protocol-specification-things-create-or-modify.html
index 96c59c8..07a6623 100644
--- a/1.0/protocol-specification-things-create-or-modify.html
+++ b/1.0/protocol-specification-things-create-or-modify.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things-delete.html b/1.0/protocol-specification-things-delete.html
index a9f71ec..7245f8c 100644
--- a/1.0/protocol-specification-things-delete.html
+++ b/1.0/protocol-specification-things-delete.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things-messages.html b/1.0/protocol-specification-things-messages.html
index d3ec058..037f1b5 100644
--- a/1.0/protocol-specification-things-messages.html
+++ b/1.0/protocol-specification-things-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things-retrieve.html b/1.0/protocol-specification-things-retrieve.html
index 2374d00..a20deaa 100644
--- a/1.0/protocol-specification-things-retrieve.html
+++ b/1.0/protocol-specification-things-retrieve.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things-search.html b/1.0/protocol-specification-things-search.html
index 97c327b..a67021a 100644
--- a/1.0/protocol-specification-things-search.html
+++ b/1.0/protocol-specification-things-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-things.html b/1.0/protocol-specification-things.html
index 43062cf..914b52a 100644
--- a/1.0/protocol-specification-things.html
+++ b/1.0/protocol-specification-things.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification-topic.html b/1.0/protocol-specification-topic.html
index 546ad1d..6abd877 100644
--- a/1.0/protocol-specification-topic.html
+++ b/1.0/protocol-specification-topic.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-specification.html b/1.0/protocol-specification.html
index 9340bdf..f425982 100644
--- a/1.0/protocol-specification.html
+++ b/1.0/protocol-specification.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/protocol-twinlive.html b/1.0/protocol-twinlive.html
index 0a89243..d8bc131 100644
--- a/1.0/protocol-twinlive.html
+++ b/1.0/protocol-twinlive.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_010-M1.html b/1.0/release_notes_010-M1.html
index de88d6b..7a33c59 100644
--- a/1.0/release_notes_010-M1.html
+++ b/1.0/release_notes_010-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_010-M3.html b/1.0/release_notes_010-M3.html
index 470de95..e42febe 100644
--- a/1.0/release_notes_010-M3.html
+++ b/1.0/release_notes_010-M3.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_020-M1.html b/1.0/release_notes_020-M1.html
index 94649b8..ee68cae 100644
--- a/1.0/release_notes_020-M1.html
+++ b/1.0/release_notes_020-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_030-M1.html b/1.0/release_notes_030-M1.html
index c1637a3..d1ac4b4 100644
--- a/1.0/release_notes_030-M1.html
+++ b/1.0/release_notes_030-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_030-M2.html b/1.0/release_notes_030-M2.html
index 80b4f6d..5c24277 100644
--- a/1.0/release_notes_030-M2.html
+++ b/1.0/release_notes_030-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_080-M1.html b/1.0/release_notes_080-M1.html
index 08cbd64..3537952 100644
--- a/1.0/release_notes_080-M1.html
+++ b/1.0/release_notes_080-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_080-M2.html b/1.0/release_notes_080-M2.html
index 69f8c4d..e4dba04 100644
--- a/1.0/release_notes_080-M2.html
+++ b/1.0/release_notes_080-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_080-M3.html b/1.0/release_notes_080-M3.html
index f9c9e6c..b0336f1 100644
--- a/1.0/release_notes_080-M3.html
+++ b/1.0/release_notes_080-M3.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_080.html b/1.0/release_notes_080.html
index 35df8cb..0fedc86 100644
--- a/1.0/release_notes_080.html
+++ b/1.0/release_notes_080.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_090-M1.html b/1.0/release_notes_090-M1.html
index 585fe32..8f758e4 100644
--- a/1.0/release_notes_090-M1.html
+++ b/1.0/release_notes_090-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_090-M2.html b/1.0/release_notes_090-M2.html
index 1df0b80..7b550e3 100644
--- a/1.0/release_notes_090-M2.html
+++ b/1.0/release_notes_090-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_090.html b/1.0/release_notes_090.html
index 2cc0f1f..2d82fb0 100644
--- a/1.0/release_notes_090.html
+++ b/1.0/release_notes_090.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_100-M1a.html b/1.0/release_notes_100-M1a.html
index d5baed2..b8f6019 100644
--- a/1.0/release_notes_100-M1a.html
+++ b/1.0/release_notes_100-M1a.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_100-M2.html b/1.0/release_notes_100-M2.html
index d060019..5751e87 100644
--- a/1.0/release_notes_100-M2.html
+++ b/1.0/release_notes_100-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_100.html b/1.0/release_notes_100.html
index 26f6586..7151b0a 100644
--- a/1.0/release_notes_100.html
+++ b/1.0/release_notes_100.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/release_notes_110.html b/1.0/release_notes_110.html
index c0ee2a5..38780ae 100644
--- a/1.0/release_notes_110.html
+++ b/1.0/release_notes_110.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/sandbox.html b/1.0/sandbox.html
index 45fa3bb..32aeea9 100644
--- a/1.0/sandbox.html
+++ b/1.0/sandbox.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_architecture.html b/1.0/tag_architecture.html
index be5f83d..350113b 100644
--- a/1.0/tag_architecture.html
+++ b/1.0/tag_architecture.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_blog.html b/1.0/tag_blog.html
index d2ec21d..971ebf5 100644
--- a/1.0/tag_blog.html
+++ b/1.0/tag_blog.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_client_sdk.html b/1.0/tag_client_sdk.html
index 9f29c78..8b2f8bd 100644
--- a/1.0/tag_client_sdk.html
+++ b/1.0/tag_client_sdk.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_connectivity.html b/1.0/tag_connectivity.html
index e27eee1..fca8416 100644
--- a/1.0/tag_connectivity.html
+++ b/1.0/tag_connectivity.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_getting_started.html b/1.0/tag_getting_started.html
index b8d780c..e176d38 100644
--- a/1.0/tag_getting_started.html
+++ b/1.0/tag_getting_started.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_http.html b/1.0/tag_http.html
index ffb6c6b..8d0e24d 100644
--- a/1.0/tag_http.html
+++ b/1.0/tag_http.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_installation.html b/1.0/tag_installation.html
index fec6c03..09b4f61 100644
--- a/1.0/tag_installation.html
+++ b/1.0/tag_installation.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_model.html b/1.0/tag_model.html
index 594f768..64f1e51 100644
--- a/1.0/tag_model.html
+++ b/1.0/tag_model.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_news.html b/1.0/tag_news.html
index 5ee5b24..ca58f19 100644
--- a/1.0/tag_news.html
+++ b/1.0/tag_news.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_protocol.html b/1.0/tag_protocol.html
index de92ef8..c139b30 100644
--- a/1.0/tag_protocol.html
+++ b/1.0/tag_protocol.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_release_notes.html b/1.0/tag_release_notes.html
index e97c055..99e8970 100644
--- a/1.0/tag_release_notes.html
+++ b/1.0/tag_release_notes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_rql.html b/1.0/tag_rql.html
index 4c5b7bc..8e99ed3 100644
--- a/1.0/tag_rql.html
+++ b/1.0/tag_rql.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_search.html b/1.0/tag_search.html
index bb5c98e..ca0d7e3 100644
--- a/1.0/tag_search.html
+++ b/1.0/tag_search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_signal.html b/1.0/tag_signal.html
index a5e519e..e522af4 100644
--- a/1.0/tag_signal.html
+++ b/1.0/tag_signal.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.0/tag_troubleshooting.html b/1.0/tag_troubleshooting.html
index cb85cff..900e755 100644
--- a/1.0/tag_troubleshooting.html
+++ b/1.0/tag_troubleshooting.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1378,48 +1384,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/404.html b/1.1/404.html
index b20cc59..b3d7f64 100644
--- a/1.1/404.html
+++ b/1.1/404.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-overview.html b/1.1/architecture-overview.html
index b6929aa..c1977ec 100644
--- a/1.1/architecture-overview.html
+++ b/1.1/architecture-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-concierge.html b/1.1/architecture-services-concierge.html
index 99d5f68..dfddd34 100644
--- a/1.1/architecture-services-concierge.html
+++ b/1.1/architecture-services-concierge.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-connectivity.html b/1.1/architecture-services-connectivity.html
index 933a22f..91db327 100644
--- a/1.1/architecture-services-connectivity.html
+++ b/1.1/architecture-services-connectivity.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-gateway.html b/1.1/architecture-services-gateway.html
index 030bad4..76f0d57 100644
--- a/1.1/architecture-services-gateway.html
+++ b/1.1/architecture-services-gateway.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-policies.html b/1.1/architecture-services-policies.html
index 5c9601c..ff7e4d9 100644
--- a/1.1/architecture-services-policies.html
+++ b/1.1/architecture-services-policies.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-things-search.html b/1.1/architecture-services-things-search.html
index 9f730c3..ceff01a 100644
--- a/1.1/architecture-services-things-search.html
+++ b/1.1/architecture-services-things-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/architecture-services-things.html b/1.1/architecture-services-things.html
index 3280344..8d8083c 100644
--- a/1.1/architecture-services-things.html
+++ b/1.1/architecture-services-things.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-acknowledgements.html b/1.1/basic-acknowledgements.html
index 48ba18a..c8b2386 100644
--- a/1.1/basic-acknowledgements.html
+++ b/1.1/basic-acknowledgements.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-acl.html b/1.1/basic-acl.html
index 29fa74f..feaabf2 100644
--- a/1.1/basic-acl.html
+++ b/1.1/basic-acl.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-apis.html b/1.1/basic-apis.html
index d6daa8d..2e9c7b4 100644
--- a/1.1/basic-apis.html
+++ b/1.1/basic-apis.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-auth.html b/1.1/basic-auth.html
index 42f5871..b4c39e4 100644
--- a/1.1/basic-auth.html
+++ b/1.1/basic-auth.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-changenotifications.html b/1.1/basic-changenotifications.html
index cdf5505..494f4a3 100644
--- a/1.1/basic-changenotifications.html
+++ b/1.1/basic-changenotifications.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-connections.html b/1.1/basic-connections.html
index 6cc0a44..8bb276f 100644
--- a/1.1/basic-connections.html
+++ b/1.1/basic-connections.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-enrichment.html b/1.1/basic-enrichment.html
index 2d7913f..58b36ca 100644
--- a/1.1/basic-enrichment.html
+++ b/1.1/basic-enrichment.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-feature.html b/1.1/basic-feature.html
index f448763..006c394 100644
--- a/1.1/basic-feature.html
+++ b/1.1/basic-feature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-messages.html b/1.1/basic-messages.html
index 41743f7..6fb7b49 100644
--- a/1.1/basic-messages.html
+++ b/1.1/basic-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-namespaces-and-names.html b/1.1/basic-namespaces-and-names.html
index ce063a7..7272a14 100644
--- a/1.1/basic-namespaces-and-names.html
+++ b/1.1/basic-namespaces-and-names.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-overview.html b/1.1/basic-overview.html
index fb2cd0b..30c6800 100644
--- a/1.1/basic-overview.html
+++ b/1.1/basic-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-placeholders.html b/1.1/basic-placeholders.html
index f641c0b..ed78e32 100644
--- a/1.1/basic-placeholders.html
+++ b/1.1/basic-placeholders.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-policy.html b/1.1/basic-policy.html
index 423cbcf..c6bc008 100644
--- a/1.1/basic-policy.html
+++ b/1.1/basic-policy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-rql.html b/1.1/basic-rql.html
index 1912d63..d39f895 100644
--- a/1.1/basic-rql.html
+++ b/1.1/basic-rql.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-search.html b/1.1/basic-search.html
index 9e4ce83..6d9a87b 100644
--- a/1.1/basic-search.html
+++ b/1.1/basic-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-signals-command.html b/1.1/basic-signals-command.html
index 79ddda4..6607ffd 100644
--- a/1.1/basic-signals-command.html
+++ b/1.1/basic-signals-command.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-signals-commandresponse.html b/1.1/basic-signals-commandresponse.html
index 79ffd9c..c545ef1 100644
--- a/1.1/basic-signals-commandresponse.html
+++ b/1.1/basic-signals-commandresponse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-signals-errorresponse.html b/1.1/basic-signals-errorresponse.html
index 2347efd..7e9402f 100644
--- a/1.1/basic-signals-errorresponse.html
+++ b/1.1/basic-signals-errorresponse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-signals-event.html b/1.1/basic-signals-event.html
index c883ae8..98d7f84 100644
--- a/1.1/basic-signals-event.html
+++ b/1.1/basic-signals-event.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-signals.html b/1.1/basic-signals.html
index d744868..7c0b177 100644
--- a/1.1/basic-signals.html
+++ b/1.1/basic-signals.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/basic-thing.html b/1.1/basic-thing.html
index d78102b..4300704 100644
--- a/1.1/basic-thing.html
+++ b/1.1/basic-thing.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/client-sdk-java.html b/1.1/client-sdk-java.html
index ea2f5c6..2d35816 100644
--- a/1.1/client-sdk-java.html
+++ b/1.1/client-sdk-java.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/client-sdk-javascript.html b/1.1/client-sdk-javascript.html
index 3f3bc50..889dcf5 100644
--- a/1.1/client-sdk-javascript.html
+++ b/1.1/client-sdk-javascript.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/client-sdk-overview.html b/1.1/client-sdk-overview.html
index 27e35af..47346b5 100644
--- a/1.1/client-sdk-overview.html
+++ b/1.1/client-sdk-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-header-mapping.html b/1.1/connectivity-header-mapping.html
index 5b12265..ad47678 100644
--- a/1.1/connectivity-header-mapping.html
+++ b/1.1/connectivity-header-mapping.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-manage-connections.html b/1.1/connectivity-manage-connections.html
index e6914b7..25b8737 100644
--- a/1.1/connectivity-manage-connections.html
+++ b/1.1/connectivity-manage-connections.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-mapping.html b/1.1/connectivity-mapping.html
index 464054c..2777401 100644
--- a/1.1/connectivity-mapping.html
+++ b/1.1/connectivity-mapping.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-overview.html b/1.1/connectivity-overview.html
index 70d9763..05c097a 100644
--- a/1.1/connectivity-overview.html
+++ b/1.1/connectivity-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-amqp091.html b/1.1/connectivity-protocol-bindings-amqp091.html
index d3d6f9c..94cd629 100644
--- a/1.1/connectivity-protocol-bindings-amqp091.html
+++ b/1.1/connectivity-protocol-bindings-amqp091.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-amqp10.html b/1.1/connectivity-protocol-bindings-amqp10.html
index 328bcc0..8f69e60 100644
--- a/1.1/connectivity-protocol-bindings-amqp10.html
+++ b/1.1/connectivity-protocol-bindings-amqp10.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-http.html b/1.1/connectivity-protocol-bindings-http.html
index ec11907..32ea7c6 100644
--- a/1.1/connectivity-protocol-bindings-http.html
+++ b/1.1/connectivity-protocol-bindings-http.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-kafka2.html b/1.1/connectivity-protocol-bindings-kafka2.html
index 021223c..c4aa343 100644
--- a/1.1/connectivity-protocol-bindings-kafka2.html
+++ b/1.1/connectivity-protocol-bindings-kafka2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-mqtt.html b/1.1/connectivity-protocol-bindings-mqtt.html
index a6c8928..5b3fb12 100644
--- a/1.1/connectivity-protocol-bindings-mqtt.html
+++ b/1.1/connectivity-protocol-bindings-mqtt.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-protocol-bindings-mqtt5.html b/1.1/connectivity-protocol-bindings-mqtt5.html
index 2a6e813..a6d14cf 100644
--- a/1.1/connectivity-protocol-bindings-mqtt5.html
+++ b/1.1/connectivity-protocol-bindings-mqtt5.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/connectivity-tls-certificates.html b/1.1/connectivity-tls-certificates.html
index 55c1911..56d33e7 100644
--- a/1.1/connectivity-tls-certificates.html
+++ b/1.1/connectivity-tls-certificates.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/feedback.html b/1.1/feedback.html
index 8f8f4f9..e9a241e 100644
--- a/1.1/feedback.html
+++ b/1.1/feedback.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/glossary.html b/1.1/glossary.html
index a4c397b..8faf563 100644
--- a/1.1/glossary.html
+++ b/1.1/glossary.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-concepts.html b/1.1/httpapi-concepts.html
index e1ec4b9..18e38ca 100644
--- a/1.1/httpapi-concepts.html
+++ b/1.1/httpapi-concepts.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-messages.html b/1.1/httpapi-messages.html
index b2fb960..a95da91 100644
--- a/1.1/httpapi-messages.html
+++ b/1.1/httpapi-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-overview.html b/1.1/httpapi-overview.html
index 3878920..687b66f 100644
--- a/1.1/httpapi-overview.html
+++ b/1.1/httpapi-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-protocol-bindings-websocket.html b/1.1/httpapi-protocol-bindings-websocket.html
index 37629b6..01584e9 100644
--- a/1.1/httpapi-protocol-bindings-websocket.html
+++ b/1.1/httpapi-protocol-bindings-websocket.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-search.html b/1.1/httpapi-search.html
index f471b53..a285552 100644
--- a/1.1/httpapi-search.html
+++ b/1.1/httpapi-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/httpapi-sse.html b/1.1/httpapi-sse.html
index 6e46652..3dd915b 100644
--- a/1.1/httpapi-sse.html
+++ b/1.1/httpapi-sse.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/installation-building.html b/1.1/installation-building.html
index 9ed3de0..54abb8a 100644
--- a/1.1/installation-building.html
+++ b/1.1/installation-building.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/installation-operating.html b/1.1/installation-operating.html
index 0891aa3..0c1c672 100644
--- a/1.1/installation-operating.html
+++ b/1.1/installation-operating.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/installation-running.html b/1.1/installation-running.html
index 475fef6..51e87d9 100644
--- a/1.1/installation-running.html
+++ b/1.1/installation-running.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/intro-digitaltwins.html b/1.1/intro-digitaltwins.html
index faf2644..5d32855 100644
--- a/1.1/intro-digitaltwins.html
+++ b/1.1/intro-digitaltwins.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/intro-hello-world.html b/1.1/intro-hello-world.html
index 631e629..4f57188 100644
--- a/1.1/intro-hello-world.html
+++ b/1.1/intro-hello-world.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/intro-overview.html b/1.1/intro-overview.html
index b78a6d0..ff5a127 100644
--- a/1.1/intro-overview.html
+++ b/1.1/intro-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/js/customscripts.js b/1.1/js/customscripts.js
index 96aff54..c45cdb9 100644
--- a/1.1/js/customscripts.js
+++ b/1.1/js/customscripts.js
@@ -34,4 +34,46 @@
         });
 
     });
+
+    $("#dev-warning").hide();
+    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
+    $("#docVersion").change(changeSelectedDocVersion);
 });
+
+function changeSelectedDocVersionDropdownSelection(element) {
+    var pathName = window.location.pathname;
+
+    var versionOptions = element.options;
+    for (var i = 0; i < versionOptions.length; i++) {
+        var versionValue = versionOptions[i].value;
+        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
+            $("#docVersion").val(versionValue).change();
+            return;
+        }
+    }
+    // fallback: dev with "empty" version value:
+    $("#docVersion").val("").change();
+    $("#dev-warning").show();
+}
+
+function changeSelectedDocVersion() {
+    var versionValue = $('#docVersion').val();
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
+    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
+    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
+    if (versionValue === "" && !versionMatch) {
+        // do nothing, we're already on the correct "dev" version
+    } else if (versionMatch && (versionValue === versionMatch[1])) {
+        // do nothing, we're already on the correct version
+    } else {
+        if (versionValue === "" && versionMatch) {
+            window.location.pathname = "ditto/" + versionMatch[2];
+        } else if (versionValue === "") {
+            window.location.pathname = "ditto/" + remainingPath;
+        } else if (versionMatch) {
+            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
+        } else {
+            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
+        }
+    }
+}
diff --git a/1.1/presentations.html b/1.1/presentations.html
index 298c169..7594f29 100644
--- a/1.1/presentations.html
+++ b/1.1/presentations.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-bindings.html b/1.1/protocol-bindings.html
index 0e98d2f..761f4e8 100644
--- a/1.1/protocol-bindings.html
+++ b/1.1/protocol-bindings.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createattribute.html b/1.1/protocol-examples-createattribute.html
index ca87d48..ecdc4fb 100644
--- a/1.1/protocol-examples-createattribute.html
+++ b/1.1/protocol-examples-createattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createattributes.html b/1.1/protocol-examples-createattributes.html
index dd00597..f13f19d 100644
--- a/1.1/protocol-examples-createattributes.html
+++ b/1.1/protocol-examples-createattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createdefinition.html b/1.1/protocol-examples-createdefinition.html
index 9e56d13..c1bcf8e 100644
--- a/1.1/protocol-examples-createdefinition.html
+++ b/1.1/protocol-examples-createdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createfeature.html b/1.1/protocol-examples-createfeature.html
index d6bef93..12fb99e 100644
--- a/1.1/protocol-examples-createfeature.html
+++ b/1.1/protocol-examples-createfeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createfeatures.html b/1.1/protocol-examples-createfeatures.html
index e22dfad..b32db2b 100644
--- a/1.1/protocol-examples-createfeatures.html
+++ b/1.1/protocol-examples-createfeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createproperties.html b/1.1/protocol-examples-createproperties.html
index 4db9189..44e297e 100644
--- a/1.1/protocol-examples-createproperties.html
+++ b/1.1/protocol-examples-createproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createproperty.html b/1.1/protocol-examples-createproperty.html
index 2104fe2..588cc97 100644
--- a/1.1/protocol-examples-createproperty.html
+++ b/1.1/protocol-examples-createproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-creatething.html b/1.1/protocol-examples-creatething.html
index 518acd7..7232c9e 100644
--- a/1.1/protocol-examples-creatething.html
+++ b/1.1/protocol-examples-creatething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-createthingdefinition.html b/1.1/protocol-examples-createthingdefinition.html
index 5c84d88..8c23cdb 100644
--- a/1.1/protocol-examples-createthingdefinition.html
+++ b/1.1/protocol-examples-createthingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deleteattribute.html b/1.1/protocol-examples-deleteattribute.html
index 5e07af0..c08160a 100644
--- a/1.1/protocol-examples-deleteattribute.html
+++ b/1.1/protocol-examples-deleteattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deleteattributes.html b/1.1/protocol-examples-deleteattributes.html
index 5480cdb..f64ff9c 100644
--- a/1.1/protocol-examples-deleteattributes.html
+++ b/1.1/protocol-examples-deleteattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deletedefinition.html b/1.1/protocol-examples-deletedefinition.html
index a886da6..cc9d210 100644
--- a/1.1/protocol-examples-deletedefinition.html
+++ b/1.1/protocol-examples-deletedefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deletefeature.html b/1.1/protocol-examples-deletefeature.html
index fad9b58..be74936 100644
--- a/1.1/protocol-examples-deletefeature.html
+++ b/1.1/protocol-examples-deletefeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deletefeatures.html b/1.1/protocol-examples-deletefeatures.html
index 40c7a5e..55e4151 100644
--- a/1.1/protocol-examples-deletefeatures.html
+++ b/1.1/protocol-examples-deletefeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deleteproperties.html b/1.1/protocol-examples-deleteproperties.html
index 43c616a..4d0f97c 100644
--- a/1.1/protocol-examples-deleteproperties.html
+++ b/1.1/protocol-examples-deleteproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deleteproperty.html b/1.1/protocol-examples-deleteproperty.html
index d532da2..3d86c09 100644
--- a/1.1/protocol-examples-deleteproperty.html
+++ b/1.1/protocol-examples-deleteproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deletething.html b/1.1/protocol-examples-deletething.html
index 41eac74..f60e340 100644
--- a/1.1/protocol-examples-deletething.html
+++ b/1.1/protocol-examples-deletething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-deletethingdefinition.html b/1.1/protocol-examples-deletethingdefinition.html
index fdf77c3..6ec8ac7 100644
--- a/1.1/protocol-examples-deletethingdefinition.html
+++ b/1.1/protocol-examples-deletethingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-errorresponses.html b/1.1/protocol-examples-errorresponses.html
index 9f3a45e..18b0a32 100644
--- a/1.1/protocol-examples-errorresponses.html
+++ b/1.1/protocol-examples-errorresponses.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyattribute.html b/1.1/protocol-examples-modifyattribute.html
index 3570288..4337e49 100644
--- a/1.1/protocol-examples-modifyattribute.html
+++ b/1.1/protocol-examples-modifyattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyattributes.html b/1.1/protocol-examples-modifyattributes.html
index 774ba6a..9fcf9ca 100644
--- a/1.1/protocol-examples-modifyattributes.html
+++ b/1.1/protocol-examples-modifyattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifydefinition.html b/1.1/protocol-examples-modifydefinition.html
index 3f0b9e2..c3f8a62 100644
--- a/1.1/protocol-examples-modifydefinition.html
+++ b/1.1/protocol-examples-modifydefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyfeature.html b/1.1/protocol-examples-modifyfeature.html
index c65bc90..61368fa 100644
--- a/1.1/protocol-examples-modifyfeature.html
+++ b/1.1/protocol-examples-modifyfeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyfeatures.html b/1.1/protocol-examples-modifyfeatures.html
index 2d2f3d2..6c67000 100644
--- a/1.1/protocol-examples-modifyfeatures.html
+++ b/1.1/protocol-examples-modifyfeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifypolicyid.html b/1.1/protocol-examples-modifypolicyid.html
index 3a9db21..33b1507 100644
--- a/1.1/protocol-examples-modifypolicyid.html
+++ b/1.1/protocol-examples-modifypolicyid.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyproperties.html b/1.1/protocol-examples-modifyproperties.html
index e86b41c..2159a6d 100644
--- a/1.1/protocol-examples-modifyproperties.html
+++ b/1.1/protocol-examples-modifyproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifyproperty.html b/1.1/protocol-examples-modifyproperty.html
index efb2475..5936f7a 100644
--- a/1.1/protocol-examples-modifyproperty.html
+++ b/1.1/protocol-examples-modifyproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifything.html b/1.1/protocol-examples-modifything.html
index e34652f..5b6770b 100644
--- a/1.1/protocol-examples-modifything.html
+++ b/1.1/protocol-examples-modifything.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-modifythingdefinition.html b/1.1/protocol-examples-modifythingdefinition.html
index 3cf0d87..e83ef6d 100644
--- a/1.1/protocol-examples-modifythingdefinition.html
+++ b/1.1/protocol-examples-modifythingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-createpolicy.html b/1.1/protocol-examples-policies-createpolicy.html
index ec6d88f..4aaadb4 100644
--- a/1.1/protocol-examples-policies-createpolicy.html
+++ b/1.1/protocol-examples-policies-createpolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-createpolicyentry.html b/1.1/protocol-examples-policies-createpolicyentry.html
index 6696f3e..451710b 100644
--- a/1.1/protocol-examples-policies-createpolicyentry.html
+++ b/1.1/protocol-examples-policies-createpolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-createresource.html b/1.1/protocol-examples-policies-createresource.html
index 6f414ed..0ceeee5 100644
--- a/1.1/protocol-examples-policies-createresource.html
+++ b/1.1/protocol-examples-policies-createresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-createsubject.html b/1.1/protocol-examples-policies-createsubject.html
index e31446e..df1ca2a 100644
--- a/1.1/protocol-examples-policies-createsubject.html
+++ b/1.1/protocol-examples-policies-createsubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-deletepolicy.html b/1.1/protocol-examples-policies-deletepolicy.html
index 205e7cd..367b849 100644
--- a/1.1/protocol-examples-policies-deletepolicy.html
+++ b/1.1/protocol-examples-policies-deletepolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-deletepolicyentry.html b/1.1/protocol-examples-policies-deletepolicyentry.html
index 31a85a0..e1e25e6 100644
--- a/1.1/protocol-examples-policies-deletepolicyentry.html
+++ b/1.1/protocol-examples-policies-deletepolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-deleteresource.html b/1.1/protocol-examples-policies-deleteresource.html
index e2e7d63..d767740 100644
--- a/1.1/protocol-examples-policies-deleteresource.html
+++ b/1.1/protocol-examples-policies-deleteresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-deletesubject.html b/1.1/protocol-examples-policies-deletesubject.html
index e9dac22..9b0a61c 100644
--- a/1.1/protocol-examples-policies-deletesubject.html
+++ b/1.1/protocol-examples-policies-deletesubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-errorresponses.html b/1.1/protocol-examples-policies-errorresponses.html
index 529bd13..07266fc 100644
--- a/1.1/protocol-examples-policies-errorresponses.html
+++ b/1.1/protocol-examples-policies-errorresponses.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifypolicy.html b/1.1/protocol-examples-policies-modifypolicy.html
index 05c066c..bf1c1cd 100644
--- a/1.1/protocol-examples-policies-modifypolicy.html
+++ b/1.1/protocol-examples-policies-modifypolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifypolicyentries.html b/1.1/protocol-examples-policies-modifypolicyentries.html
index b4ff188..faa2e45 100644
--- a/1.1/protocol-examples-policies-modifypolicyentries.html
+++ b/1.1/protocol-examples-policies-modifypolicyentries.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifypolicyentry.html b/1.1/protocol-examples-policies-modifypolicyentry.html
index 5db6174..9f1cad1 100644
--- a/1.1/protocol-examples-policies-modifypolicyentry.html
+++ b/1.1/protocol-examples-policies-modifypolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifyresource.html b/1.1/protocol-examples-policies-modifyresource.html
index 9bf1d9f..775171d 100644
--- a/1.1/protocol-examples-policies-modifyresource.html
+++ b/1.1/protocol-examples-policies-modifyresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifyresources.html b/1.1/protocol-examples-policies-modifyresources.html
index 77a023d..23ffb97 100644
--- a/1.1/protocol-examples-policies-modifyresources.html
+++ b/1.1/protocol-examples-policies-modifyresources.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifysubject.html b/1.1/protocol-examples-policies-modifysubject.html
index 2e19399..b00ada0 100644
--- a/1.1/protocol-examples-policies-modifysubject.html
+++ b/1.1/protocol-examples-policies-modifysubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-modifysubjects.html b/1.1/protocol-examples-policies-modifysubjects.html
index 165fc26..0394d0d 100644
--- a/1.1/protocol-examples-policies-modifysubjects.html
+++ b/1.1/protocol-examples-policies-modifysubjects.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrievepolicy.html b/1.1/protocol-examples-policies-retrievepolicy.html
index 0cf2259..09bfc45 100644
--- a/1.1/protocol-examples-policies-retrievepolicy.html
+++ b/1.1/protocol-examples-policies-retrievepolicy.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrievepolicyentries.html b/1.1/protocol-examples-policies-retrievepolicyentries.html
index fdfb8d7..e7b2ca7 100644
--- a/1.1/protocol-examples-policies-retrievepolicyentries.html
+++ b/1.1/protocol-examples-policies-retrievepolicyentries.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrievepolicyentry.html b/1.1/protocol-examples-policies-retrievepolicyentry.html
index f0dae5d..7859824 100644
--- a/1.1/protocol-examples-policies-retrievepolicyentry.html
+++ b/1.1/protocol-examples-policies-retrievepolicyentry.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrieveresource.html b/1.1/protocol-examples-policies-retrieveresource.html
index e42efda..5357309 100644
--- a/1.1/protocol-examples-policies-retrieveresource.html
+++ b/1.1/protocol-examples-policies-retrieveresource.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrieveresources.html b/1.1/protocol-examples-policies-retrieveresources.html
index 697c86e..e749f27 100644
--- a/1.1/protocol-examples-policies-retrieveresources.html
+++ b/1.1/protocol-examples-policies-retrieveresources.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrievesubject.html b/1.1/protocol-examples-policies-retrievesubject.html
index 0160709..32790fd 100644
--- a/1.1/protocol-examples-policies-retrievesubject.html
+++ b/1.1/protocol-examples-policies-retrievesubject.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-policies-retrievesubjects.html b/1.1/protocol-examples-policies-retrievesubjects.html
index 2614fdb..2dde7db 100644
--- a/1.1/protocol-examples-policies-retrievesubjects.html
+++ b/1.1/protocol-examples-policies-retrievesubjects.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrieveattribute.html b/1.1/protocol-examples-retrieveattribute.html
index 4617407..d1b97d9 100644
--- a/1.1/protocol-examples-retrieveattribute.html
+++ b/1.1/protocol-examples-retrieveattribute.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrieveattributes.html b/1.1/protocol-examples-retrieveattributes.html
index e9e62e2..d9f1919 100644
--- a/1.1/protocol-examples-retrieveattributes.html
+++ b/1.1/protocol-examples-retrieveattributes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievedefinition.html b/1.1/protocol-examples-retrievedefinition.html
index ff9fcb8..db7c5cf 100644
--- a/1.1/protocol-examples-retrievedefinition.html
+++ b/1.1/protocol-examples-retrievedefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievefeature.html b/1.1/protocol-examples-retrievefeature.html
index 5faec5d..9552d82 100644
--- a/1.1/protocol-examples-retrievefeature.html
+++ b/1.1/protocol-examples-retrievefeature.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievefeatures.html b/1.1/protocol-examples-retrievefeatures.html
index ca368a6..9479bb2 100644
--- a/1.1/protocol-examples-retrievefeatures.html
+++ b/1.1/protocol-examples-retrievefeatures.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrieveproperties.html b/1.1/protocol-examples-retrieveproperties.html
index 7e92869..fd5e512 100644
--- a/1.1/protocol-examples-retrieveproperties.html
+++ b/1.1/protocol-examples-retrieveproperties.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrieveproperty.html b/1.1/protocol-examples-retrieveproperty.html
index de71ea4..34ff486 100644
--- a/1.1/protocol-examples-retrieveproperty.html
+++ b/1.1/protocol-examples-retrieveproperty.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievething.html b/1.1/protocol-examples-retrievething.html
index 99e032f..5e297d2 100644
--- a/1.1/protocol-examples-retrievething.html
+++ b/1.1/protocol-examples-retrievething.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievethingdefinition.html b/1.1/protocol-examples-retrievethingdefinition.html
index 2215d1f..d94d903 100644
--- a/1.1/protocol-examples-retrievethingdefinition.html
+++ b/1.1/protocol-examples-retrievethingdefinition.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-retrievethings.html b/1.1/protocol-examples-retrievethings.html
index 2db2904..254d596 100644
--- a/1.1/protocol-examples-retrievethings.html
+++ b/1.1/protocol-examples-retrievethings.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples-search.html b/1.1/protocol-examples-search.html
index a6eff80..9aec26f 100644
--- a/1.1/protocol-examples-search.html
+++ b/1.1/protocol-examples-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-examples.html b/1.1/protocol-examples.html
index c84b1eb..a938218 100644
--- a/1.1/protocol-examples.html
+++ b/1.1/protocol-examples.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-overview.html b/1.1/protocol-overview.html
index fcfb992..14b143e 100644
--- a/1.1/protocol-overview.html
+++ b/1.1/protocol-overview.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-acks.html b/1.1/protocol-specification-acks.html
index 375dc4d..aec2c02 100644
--- a/1.1/protocol-specification-acks.html
+++ b/1.1/protocol-specification-acks.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-policies-create-or-modify.html b/1.1/protocol-specification-policies-create-or-modify.html
index 7ea478b..0825acc 100644
--- a/1.1/protocol-specification-policies-create-or-modify.html
+++ b/1.1/protocol-specification-policies-create-or-modify.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-policies-delete.html b/1.1/protocol-specification-policies-delete.html
index f4abfe9..ba00f9a 100644
--- a/1.1/protocol-specification-policies-delete.html
+++ b/1.1/protocol-specification-policies-delete.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-policies-retrieve.html b/1.1/protocol-specification-policies-retrieve.html
index 2d89adb..8ae56c8 100644
--- a/1.1/protocol-specification-policies-retrieve.html
+++ b/1.1/protocol-specification-policies-retrieve.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-policies.html b/1.1/protocol-specification-policies.html
index a63435d..b4a2106 100644
--- a/1.1/protocol-specification-policies.html
+++ b/1.1/protocol-specification-policies.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things-create-or-modify.html b/1.1/protocol-specification-things-create-or-modify.html
index 1adb90b..60588df 100644
--- a/1.1/protocol-specification-things-create-or-modify.html
+++ b/1.1/protocol-specification-things-create-or-modify.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things-delete.html b/1.1/protocol-specification-things-delete.html
index 5e2f8c4..34260cd 100644
--- a/1.1/protocol-specification-things-delete.html
+++ b/1.1/protocol-specification-things-delete.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things-messages.html b/1.1/protocol-specification-things-messages.html
index a55fa9e..dc9af6f 100644
--- a/1.1/protocol-specification-things-messages.html
+++ b/1.1/protocol-specification-things-messages.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things-retrieve.html b/1.1/protocol-specification-things-retrieve.html
index b14445f..8d7b734 100644
--- a/1.1/protocol-specification-things-retrieve.html
+++ b/1.1/protocol-specification-things-retrieve.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things-search.html b/1.1/protocol-specification-things-search.html
index 3b14eb4..ccaa00e 100644
--- a/1.1/protocol-specification-things-search.html
+++ b/1.1/protocol-specification-things-search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-things.html b/1.1/protocol-specification-things.html
index dca8ea1..5932fee 100644
--- a/1.1/protocol-specification-things.html
+++ b/1.1/protocol-specification-things.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification-topic.html b/1.1/protocol-specification-topic.html
index 2495a7f..4a8e89f 100644
--- a/1.1/protocol-specification-topic.html
+++ b/1.1/protocol-specification-topic.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-specification.html b/1.1/protocol-specification.html
index 47f9b46..0414d4e 100644
--- a/1.1/protocol-specification.html
+++ b/1.1/protocol-specification.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/protocol-twinlive.html b/1.1/protocol-twinlive.html
index aa7878b..b4bf052 100644
--- a/1.1/protocol-twinlive.html
+++ b/1.1/protocol-twinlive.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_010-M1.html b/1.1/release_notes_010-M1.html
index 5ca70c3..e55a20a 100644
--- a/1.1/release_notes_010-M1.html
+++ b/1.1/release_notes_010-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_010-M3.html b/1.1/release_notes_010-M3.html
index 8d64f83..06ac334 100644
--- a/1.1/release_notes_010-M3.html
+++ b/1.1/release_notes_010-M3.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_020-M1.html b/1.1/release_notes_020-M1.html
index fe2b770..d9583f7 100644
--- a/1.1/release_notes_020-M1.html
+++ b/1.1/release_notes_020-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_030-M1.html b/1.1/release_notes_030-M1.html
index 55f359c..05a2660 100644
--- a/1.1/release_notes_030-M1.html
+++ b/1.1/release_notes_030-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_030-M2.html b/1.1/release_notes_030-M2.html
index 33c320a..8f7b9a4 100644
--- a/1.1/release_notes_030-M2.html
+++ b/1.1/release_notes_030-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_080-M1.html b/1.1/release_notes_080-M1.html
index 64a623d..7e86e11 100644
--- a/1.1/release_notes_080-M1.html
+++ b/1.1/release_notes_080-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_080-M2.html b/1.1/release_notes_080-M2.html
index 5f15416..4073a0d 100644
--- a/1.1/release_notes_080-M2.html
+++ b/1.1/release_notes_080-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_080-M3.html b/1.1/release_notes_080-M3.html
index 4b970b3..17213a2 100644
--- a/1.1/release_notes_080-M3.html
+++ b/1.1/release_notes_080-M3.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_080.html b/1.1/release_notes_080.html
index c11bc65..413b8c7 100644
--- a/1.1/release_notes_080.html
+++ b/1.1/release_notes_080.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_090-M1.html b/1.1/release_notes_090-M1.html
index 9e22e09..f644a33 100644
--- a/1.1/release_notes_090-M1.html
+++ b/1.1/release_notes_090-M1.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_090-M2.html b/1.1/release_notes_090-M2.html
index 50c0ee5..79781cf 100644
--- a/1.1/release_notes_090-M2.html
+++ b/1.1/release_notes_090-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_090.html b/1.1/release_notes_090.html
index 01988aa..8198fae 100644
--- a/1.1/release_notes_090.html
+++ b/1.1/release_notes_090.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_100-M1a.html b/1.1/release_notes_100-M1a.html
index 81207b4..17bd3b8 100644
--- a/1.1/release_notes_100-M1a.html
+++ b/1.1/release_notes_100-M1a.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_100-M2.html b/1.1/release_notes_100-M2.html
index 39345d0..0298aa4 100644
--- a/1.1/release_notes_100-M2.html
+++ b/1.1/release_notes_100-M2.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_100.html b/1.1/release_notes_100.html
index 8836acf..de18853 100644
--- a/1.1/release_notes_100.html
+++ b/1.1/release_notes_100.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_110.html b/1.1/release_notes_110.html
index 153b7bb..dd67573 100644
--- a/1.1/release_notes_110.html
+++ b/1.1/release_notes_110.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_111.html b/1.1/release_notes_111.html
index 892f8e7..dd25530 100644
--- a/1.1/release_notes_111.html
+++ b/1.1/release_notes_111.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_112.html b/1.1/release_notes_112.html
index 672bb54..27ca30e 100644
--- a/1.1/release_notes_112.html
+++ b/1.1/release_notes_112.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_113.html b/1.1/release_notes_113.html
index 5d043c3..a1bdb32 100644
--- a/1.1/release_notes_113.html
+++ b/1.1/release_notes_113.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/release_notes_115.html b/1.1/release_notes_115.html
index 46d0260..7b173c2 100644
--- a/1.1/release_notes_115.html
+++ b/1.1/release_notes_115.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/sandbox.html b/1.1/sandbox.html
index 6029eb0..c5d9f7c 100644
--- a/1.1/sandbox.html
+++ b/1.1/sandbox.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_architecture.html b/1.1/tag_architecture.html
index af6a7bb..8cbe2ff 100644
--- a/1.1/tag_architecture.html
+++ b/1.1/tag_architecture.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_blog.html b/1.1/tag_blog.html
index 0982f12..56b9e34 100644
--- a/1.1/tag_blog.html
+++ b/1.1/tag_blog.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_client_sdk.html b/1.1/tag_client_sdk.html
index 84206c3..5f40f5a 100644
--- a/1.1/tag_client_sdk.html
+++ b/1.1/tag_client_sdk.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_connectivity.html b/1.1/tag_connectivity.html
index d04b53c..4b691fc 100644
--- a/1.1/tag_connectivity.html
+++ b/1.1/tag_connectivity.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_getting_started.html b/1.1/tag_getting_started.html
index 1eb1f51..62fe9c7 100644
--- a/1.1/tag_getting_started.html
+++ b/1.1/tag_getting_started.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_http.html b/1.1/tag_http.html
index 8133c4a..ce8c5b4 100644
--- a/1.1/tag_http.html
+++ b/1.1/tag_http.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_installation.html b/1.1/tag_installation.html
index 1135f75..ce25e02 100644
--- a/1.1/tag_installation.html
+++ b/1.1/tag_installation.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_model.html b/1.1/tag_model.html
index 69908a7..bb24858 100644
--- a/1.1/tag_model.html
+++ b/1.1/tag_model.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_news.html b/1.1/tag_news.html
index e734e66..b775488 100644
--- a/1.1/tag_news.html
+++ b/1.1/tag_news.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_protocol.html b/1.1/tag_protocol.html
index 8529591..e693eaf 100644
--- a/1.1/tag_protocol.html
+++ b/1.1/tag_protocol.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_release_notes.html b/1.1/tag_release_notes.html
index 61d9e82..c60a951 100644
--- a/1.1/tag_release_notes.html
+++ b/1.1/tag_release_notes.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_rql.html b/1.1/tag_rql.html
index 9c36f4a..1d500e4 100644
--- a/1.1/tag_rql.html
+++ b/1.1/tag_rql.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_search.html b/1.1/tag_search.html
index dd87ede..6bf6ebc 100644
--- a/1.1/tag_search.html
+++ b/1.1/tag_search.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_signal.html b/1.1/tag_signal.html
index bab6efa..fcef05c 100644
--- a/1.1/tag_signal.html
+++ b/1.1/tag_signal.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.1/tag_troubleshooting.html b/1.1/tag_troubleshooting.html
index 349b73e..e407d0d 100644
--- a/1.1/tag_troubleshooting.html
+++ b/1.1/tag_troubleshooting.html
@@ -204,6 +204,12 @@
         
         <option value="1.1">1.1</option>
         
+        <option value="1.2">1.2</option>
+        
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1406,48 +1412,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/404.html b/1.2/404.html
index ca1ab8f..0b8ae90 100644
--- a/1.2/404.html
+++ b/1.2/404.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-overview.html b/1.2/architecture-overview.html
index b1e4ad3..c7bb436 100644
--- a/1.2/architecture-overview.html
+++ b/1.2/architecture-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-concierge.html b/1.2/architecture-services-concierge.html
index 38103a3..bc4c882 100644
--- a/1.2/architecture-services-concierge.html
+++ b/1.2/architecture-services-concierge.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-connectivity.html b/1.2/architecture-services-connectivity.html
index 8f7e40a..49f0cb8 100644
--- a/1.2/architecture-services-connectivity.html
+++ b/1.2/architecture-services-connectivity.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-gateway.html b/1.2/architecture-services-gateway.html
index 4ce23c6..04d5d0e 100644
--- a/1.2/architecture-services-gateway.html
+++ b/1.2/architecture-services-gateway.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-policies.html b/1.2/architecture-services-policies.html
index 23b7a31..b7c5067 100644
--- a/1.2/architecture-services-policies.html
+++ b/1.2/architecture-services-policies.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-things-search.html b/1.2/architecture-services-things-search.html
index df5185c..4c18150 100644
--- a/1.2/architecture-services-things-search.html
+++ b/1.2/architecture-services-things-search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/architecture-services-things.html b/1.2/architecture-services-things.html
index e9ffd07..d8b3901 100644
--- a/1.2/architecture-services-things.html
+++ b/1.2/architecture-services-things.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-acknowledgements.html b/1.2/basic-acknowledgements.html
index e91b6c4..9e1a0bb 100644
--- a/1.2/basic-acknowledgements.html
+++ b/1.2/basic-acknowledgements.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-acl.html b/1.2/basic-acl.html
index 8541d42..7ec79a2 100644
--- a/1.2/basic-acl.html
+++ b/1.2/basic-acl.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-apis.html b/1.2/basic-apis.html
index 5971ed5..e454ed3 100644
--- a/1.2/basic-apis.html
+++ b/1.2/basic-apis.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-auth.html b/1.2/basic-auth.html
index d69cc77..0ad1cee 100644
--- a/1.2/basic-auth.html
+++ b/1.2/basic-auth.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-changenotifications.html b/1.2/basic-changenotifications.html
index a47a189..ac55825 100644
--- a/1.2/basic-changenotifications.html
+++ b/1.2/basic-changenotifications.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-connections.html b/1.2/basic-connections.html
index 0f086d7..348cc6a 100644
--- a/1.2/basic-connections.html
+++ b/1.2/basic-connections.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-enrichment.html b/1.2/basic-enrichment.html
index 6aa5c28..f50f3b5 100644
--- a/1.2/basic-enrichment.html
+++ b/1.2/basic-enrichment.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-errors.html b/1.2/basic-errors.html
index 0469c43..e5ea994 100644
--- a/1.2/basic-errors.html
+++ b/1.2/basic-errors.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-feature.html b/1.2/basic-feature.html
index 05af3e1..c2ad8f2 100644
--- a/1.2/basic-feature.html
+++ b/1.2/basic-feature.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-messages.html b/1.2/basic-messages.html
index de69aae..9aa7257 100644
--- a/1.2/basic-messages.html
+++ b/1.2/basic-messages.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-metadata.html b/1.2/basic-metadata.html
index 1bdfb11..6b9a0ab 100644
--- a/1.2/basic-metadata.html
+++ b/1.2/basic-metadata.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-namespaces-and-names.html b/1.2/basic-namespaces-and-names.html
index 4b01d9b..d366f9b 100644
--- a/1.2/basic-namespaces-and-names.html
+++ b/1.2/basic-namespaces-and-names.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-overview.html b/1.2/basic-overview.html
index a5f423a..65901f1 100644
--- a/1.2/basic-overview.html
+++ b/1.2/basic-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-placeholders.html b/1.2/basic-placeholders.html
index 74d2021..63bea49 100644
--- a/1.2/basic-placeholders.html
+++ b/1.2/basic-placeholders.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-policy.html b/1.2/basic-policy.html
index e41434e..0ece56f 100644
--- a/1.2/basic-policy.html
+++ b/1.2/basic-policy.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-rql.html b/1.2/basic-rql.html
index 31ef177..858fae1 100644
--- a/1.2/basic-rql.html
+++ b/1.2/basic-rql.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-search.html b/1.2/basic-search.html
index a990c4b..d47aafa 100644
--- a/1.2/basic-search.html
+++ b/1.2/basic-search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-signals-command.html b/1.2/basic-signals-command.html
index 9890b42..9d261a8 100644
--- a/1.2/basic-signals-command.html
+++ b/1.2/basic-signals-command.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-signals-commandresponse.html b/1.2/basic-signals-commandresponse.html
index 10251b4..67b20f8 100644
--- a/1.2/basic-signals-commandresponse.html
+++ b/1.2/basic-signals-commandresponse.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-signals-errorresponse.html b/1.2/basic-signals-errorresponse.html
index faf631c..d5c8a08 100644
--- a/1.2/basic-signals-errorresponse.html
+++ b/1.2/basic-signals-errorresponse.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-signals-event.html b/1.2/basic-signals-event.html
index cd2b1ee..1bfebbd 100644
--- a/1.2/basic-signals-event.html
+++ b/1.2/basic-signals-event.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-signals.html b/1.2/basic-signals.html
index e44e419..aa00cbd 100644
--- a/1.2/basic-signals.html
+++ b/1.2/basic-signals.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/basic-thing.html b/1.2/basic-thing.html
index 7a79d27..8934a6b 100644
--- a/1.2/basic-thing.html
+++ b/1.2/basic-thing.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/client-sdk-java.html b/1.2/client-sdk-java.html
index d46e3f0..2cab58b 100644
--- a/1.2/client-sdk-java.html
+++ b/1.2/client-sdk-java.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/client-sdk-javascript.html b/1.2/client-sdk-javascript.html
index ea23f92..557bb31 100644
--- a/1.2/client-sdk-javascript.html
+++ b/1.2/client-sdk-javascript.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/client-sdk-overview.html b/1.2/client-sdk-overview.html
index 629fccd..7d15d06 100644
--- a/1.2/client-sdk-overview.html
+++ b/1.2/client-sdk-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-header-mapping.html b/1.2/connectivity-header-mapping.html
index a55a2b1..d6d9e96 100644
--- a/1.2/connectivity-header-mapping.html
+++ b/1.2/connectivity-header-mapping.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-manage-connections.html b/1.2/connectivity-manage-connections.html
index 308f044..12b2c66 100644
--- a/1.2/connectivity-manage-connections.html
+++ b/1.2/connectivity-manage-connections.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-mapping.html b/1.2/connectivity-mapping.html
index 92fcd80..bd1cc60 100644
--- a/1.2/connectivity-mapping.html
+++ b/1.2/connectivity-mapping.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-overview.html b/1.2/connectivity-overview.html
index eb4f00a..f317df2 100644
--- a/1.2/connectivity-overview.html
+++ b/1.2/connectivity-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-amqp091.html b/1.2/connectivity-protocol-bindings-amqp091.html
index 5ef63fd..608182c 100644
--- a/1.2/connectivity-protocol-bindings-amqp091.html
+++ b/1.2/connectivity-protocol-bindings-amqp091.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-amqp10.html b/1.2/connectivity-protocol-bindings-amqp10.html
index e6803be..7a1057e 100644
--- a/1.2/connectivity-protocol-bindings-amqp10.html
+++ b/1.2/connectivity-protocol-bindings-amqp10.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-http.html b/1.2/connectivity-protocol-bindings-http.html
index 8dad2f0..cc2723e 100644
--- a/1.2/connectivity-protocol-bindings-http.html
+++ b/1.2/connectivity-protocol-bindings-http.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-kafka2.html b/1.2/connectivity-protocol-bindings-kafka2.html
index ac0c927..fd20a52 100644
--- a/1.2/connectivity-protocol-bindings-kafka2.html
+++ b/1.2/connectivity-protocol-bindings-kafka2.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-mqtt.html b/1.2/connectivity-protocol-bindings-mqtt.html
index 6dc3425..8b0db46 100644
--- a/1.2/connectivity-protocol-bindings-mqtt.html
+++ b/1.2/connectivity-protocol-bindings-mqtt.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-protocol-bindings-mqtt5.html b/1.2/connectivity-protocol-bindings-mqtt5.html
index 07a68b8..227b33f 100644
--- a/1.2/connectivity-protocol-bindings-mqtt5.html
+++ b/1.2/connectivity-protocol-bindings-mqtt5.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/connectivity-tls-certificates.html b/1.2/connectivity-tls-certificates.html
index 0ae99ba..28877e2 100644
--- a/1.2/connectivity-tls-certificates.html
+++ b/1.2/connectivity-tls-certificates.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/feedback.html b/1.2/feedback.html
index 1bbcb2e..55e6c07 100644
--- a/1.2/feedback.html
+++ b/1.2/feedback.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/glossary.html b/1.2/glossary.html
index 640fa91..2b56f8d 100644
--- a/1.2/glossary.html
+++ b/1.2/glossary.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-concepts.html b/1.2/httpapi-concepts.html
index 38e3eb0..1bde247 100644
--- a/1.2/httpapi-concepts.html
+++ b/1.2/httpapi-concepts.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-messages.html b/1.2/httpapi-messages.html
index e731ce2..e9f3e2f 100644
--- a/1.2/httpapi-messages.html
+++ b/1.2/httpapi-messages.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-overview.html b/1.2/httpapi-overview.html
index 682c08a..754161b 100644
--- a/1.2/httpapi-overview.html
+++ b/1.2/httpapi-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-protocol-bindings-websocket.html b/1.2/httpapi-protocol-bindings-websocket.html
index 285d035..e5d86b6 100644
--- a/1.2/httpapi-protocol-bindings-websocket.html
+++ b/1.2/httpapi-protocol-bindings-websocket.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-search.html b/1.2/httpapi-search.html
index 88bdd64..3c4f097 100644
--- a/1.2/httpapi-search.html
+++ b/1.2/httpapi-search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/httpapi-sse.html b/1.2/httpapi-sse.html
index fcad4d3..a17ca9d 100644
--- a/1.2/httpapi-sse.html
+++ b/1.2/httpapi-sse.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/installation-building.html b/1.2/installation-building.html
index 2adf9fe..f264c16 100644
--- a/1.2/installation-building.html
+++ b/1.2/installation-building.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/installation-operating.html b/1.2/installation-operating.html
index 379d54f..aba994b 100644
--- a/1.2/installation-operating.html
+++ b/1.2/installation-operating.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/installation-running.html b/1.2/installation-running.html
index 12796c6..dee43c3 100644
--- a/1.2/installation-running.html
+++ b/1.2/installation-running.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/intro-digitaltwins.html b/1.2/intro-digitaltwins.html
index f214b04..d7bfc93 100644
--- a/1.2/intro-digitaltwins.html
+++ b/1.2/intro-digitaltwins.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/intro-hello-world.html b/1.2/intro-hello-world.html
index f2ebd51..80326ef 100644
--- a/1.2/intro-hello-world.html
+++ b/1.2/intro-hello-world.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/intro-overview.html b/1.2/intro-overview.html
index 3939a5f..c87ffbd 100644
--- a/1.2/intro-overview.html
+++ b/1.2/intro-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/js/customscripts.js b/1.2/js/customscripts.js
index 96aff54..c45cdb9 100644
--- a/1.2/js/customscripts.js
+++ b/1.2/js/customscripts.js
@@ -34,4 +34,46 @@
         });
 
     });
+
+    $("#dev-warning").hide();
+    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
+    $("#docVersion").change(changeSelectedDocVersion);
 });
+
+function changeSelectedDocVersionDropdownSelection(element) {
+    var pathName = window.location.pathname;
+
+    var versionOptions = element.options;
+    for (var i = 0; i < versionOptions.length; i++) {
+        var versionValue = versionOptions[i].value;
+        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
+            $("#docVersion").val(versionValue).change();
+            return;
+        }
+    }
+    // fallback: dev with "empty" version value:
+    $("#docVersion").val("").change();
+    $("#dev-warning").show();
+}
+
+function changeSelectedDocVersion() {
+    var versionValue = $('#docVersion').val();
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
+    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
+    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
+    if (versionValue === "" && !versionMatch) {
+        // do nothing, we're already on the correct "dev" version
+    } else if (versionMatch && (versionValue === versionMatch[1])) {
+        // do nothing, we're already on the correct version
+    } else {
+        if (versionValue === "" && versionMatch) {
+            window.location.pathname = "ditto/" + versionMatch[2];
+        } else if (versionValue === "") {
+            window.location.pathname = "ditto/" + remainingPath;
+        } else if (versionMatch) {
+            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
+        } else {
+            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
+        }
+    }
+}
diff --git a/1.2/presentations.html b/1.2/presentations.html
index 07bbd56..4dbd862 100644
--- a/1.2/presentations.html
+++ b/1.2/presentations.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-bindings.html b/1.2/protocol-bindings.html
index 219e5f2..41ea918 100644
--- a/1.2/protocol-bindings.html
+++ b/1.2/protocol-bindings.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createattribute.html b/1.2/protocol-examples-createattribute.html
index c24e8cf..c2428fc 100644
--- a/1.2/protocol-examples-createattribute.html
+++ b/1.2/protocol-examples-createattribute.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createattributes.html b/1.2/protocol-examples-createattributes.html
index 47be659..55f0e60 100644
--- a/1.2/protocol-examples-createattributes.html
+++ b/1.2/protocol-examples-createattributes.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createdefinition.html b/1.2/protocol-examples-createdefinition.html
index 8cce0c2..fbd205e 100644
--- a/1.2/protocol-examples-createdefinition.html
+++ b/1.2/protocol-examples-createdefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createfeature.html b/1.2/protocol-examples-createfeature.html
index 29bb792..d4de9e8 100644
--- a/1.2/protocol-examples-createfeature.html
+++ b/1.2/protocol-examples-createfeature.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createfeatures.html b/1.2/protocol-examples-createfeatures.html
index aaba4ec..99e9ae8 100644
--- a/1.2/protocol-examples-createfeatures.html
+++ b/1.2/protocol-examples-createfeatures.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createproperties.html b/1.2/protocol-examples-createproperties.html
index fc30a85..cccdc8a 100644
--- a/1.2/protocol-examples-createproperties.html
+++ b/1.2/protocol-examples-createproperties.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createproperty.html b/1.2/protocol-examples-createproperty.html
index 00cba40..20350b1 100644
--- a/1.2/protocol-examples-createproperty.html
+++ b/1.2/protocol-examples-createproperty.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-creatething.html b/1.2/protocol-examples-creatething.html
index f4e3429..7cbc8e8 100644
--- a/1.2/protocol-examples-creatething.html
+++ b/1.2/protocol-examples-creatething.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-createthingdefinition.html b/1.2/protocol-examples-createthingdefinition.html
index 45b38c4..af16729 100644
--- a/1.2/protocol-examples-createthingdefinition.html
+++ b/1.2/protocol-examples-createthingdefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deleteattribute.html b/1.2/protocol-examples-deleteattribute.html
index 890d46b..407643b 100644
--- a/1.2/protocol-examples-deleteattribute.html
+++ b/1.2/protocol-examples-deleteattribute.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deleteattributes.html b/1.2/protocol-examples-deleteattributes.html
index 5c29941..a6b5af7 100644
--- a/1.2/protocol-examples-deleteattributes.html
+++ b/1.2/protocol-examples-deleteattributes.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deletedefinition.html b/1.2/protocol-examples-deletedefinition.html
index e295163..273b5c5 100644
--- a/1.2/protocol-examples-deletedefinition.html
+++ b/1.2/protocol-examples-deletedefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deletefeature.html b/1.2/protocol-examples-deletefeature.html
index 15a03ac..e9ccd09 100644
--- a/1.2/protocol-examples-deletefeature.html
+++ b/1.2/protocol-examples-deletefeature.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deletefeatures.html b/1.2/protocol-examples-deletefeatures.html
index 8fda6a9..cd5b8d4 100644
--- a/1.2/protocol-examples-deletefeatures.html
+++ b/1.2/protocol-examples-deletefeatures.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deleteproperties.html b/1.2/protocol-examples-deleteproperties.html
index fbd8c04..54a9b05 100644
--- a/1.2/protocol-examples-deleteproperties.html
+++ b/1.2/protocol-examples-deleteproperties.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deleteproperty.html b/1.2/protocol-examples-deleteproperty.html
index acecafe..445b8a4 100644
--- a/1.2/protocol-examples-deleteproperty.html
+++ b/1.2/protocol-examples-deleteproperty.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deletething.html b/1.2/protocol-examples-deletething.html
index 112a8dd..24c173a 100644
--- a/1.2/protocol-examples-deletething.html
+++ b/1.2/protocol-examples-deletething.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-deletethingdefinition.html b/1.2/protocol-examples-deletethingdefinition.html
index fd0a1d0..2a08a34 100644
--- a/1.2/protocol-examples-deletethingdefinition.html
+++ b/1.2/protocol-examples-deletethingdefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-errorresponses.html b/1.2/protocol-examples-errorresponses.html
index c67a8ef..16fb075 100644
--- a/1.2/protocol-examples-errorresponses.html
+++ b/1.2/protocol-examples-errorresponses.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyattribute.html b/1.2/protocol-examples-modifyattribute.html
index 84ab717..04d1a6d 100644
--- a/1.2/protocol-examples-modifyattribute.html
+++ b/1.2/protocol-examples-modifyattribute.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyattributes.html b/1.2/protocol-examples-modifyattributes.html
index 45ee4ba..3682ae6 100644
--- a/1.2/protocol-examples-modifyattributes.html
+++ b/1.2/protocol-examples-modifyattributes.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifydefinition.html b/1.2/protocol-examples-modifydefinition.html
index a1bbcca..834972f 100644
--- a/1.2/protocol-examples-modifydefinition.html
+++ b/1.2/protocol-examples-modifydefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyfeature.html b/1.2/protocol-examples-modifyfeature.html
index 7d74258..4341562 100644
--- a/1.2/protocol-examples-modifyfeature.html
+++ b/1.2/protocol-examples-modifyfeature.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyfeatures.html b/1.2/protocol-examples-modifyfeatures.html
index 5171f58..b663cf8 100644
--- a/1.2/protocol-examples-modifyfeatures.html
+++ b/1.2/protocol-examples-modifyfeatures.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifypolicyid.html b/1.2/protocol-examples-modifypolicyid.html
index 88873b7..c022068 100644
--- a/1.2/protocol-examples-modifypolicyid.html
+++ b/1.2/protocol-examples-modifypolicyid.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyproperties.html b/1.2/protocol-examples-modifyproperties.html
index 062a46c..a561b76 100644
--- a/1.2/protocol-examples-modifyproperties.html
+++ b/1.2/protocol-examples-modifyproperties.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifyproperty.html b/1.2/protocol-examples-modifyproperty.html
index 38dc26c..651dfdd 100644
--- a/1.2/protocol-examples-modifyproperty.html
+++ b/1.2/protocol-examples-modifyproperty.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifything.html b/1.2/protocol-examples-modifything.html
index 829416a..65b3e0f 100644
--- a/1.2/protocol-examples-modifything.html
+++ b/1.2/protocol-examples-modifything.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-modifythingdefinition.html b/1.2/protocol-examples-modifythingdefinition.html
index 3042708..998c990 100644
--- a/1.2/protocol-examples-modifythingdefinition.html
+++ b/1.2/protocol-examples-modifythingdefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-createpolicy.html b/1.2/protocol-examples-policies-createpolicy.html
index 8823294..2e763d2 100644
--- a/1.2/protocol-examples-policies-createpolicy.html
+++ b/1.2/protocol-examples-policies-createpolicy.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-createpolicyentry.html b/1.2/protocol-examples-policies-createpolicyentry.html
index f40b920..dcad6d8 100644
--- a/1.2/protocol-examples-policies-createpolicyentry.html
+++ b/1.2/protocol-examples-policies-createpolicyentry.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-createresource.html b/1.2/protocol-examples-policies-createresource.html
index e456e7e..1fb1034 100644
--- a/1.2/protocol-examples-policies-createresource.html
+++ b/1.2/protocol-examples-policies-createresource.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-createsubject.html b/1.2/protocol-examples-policies-createsubject.html
index d366d46..c64477d 100644
--- a/1.2/protocol-examples-policies-createsubject.html
+++ b/1.2/protocol-examples-policies-createsubject.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-deletepolicy.html b/1.2/protocol-examples-policies-deletepolicy.html
index d548142..ac27ea8 100644
--- a/1.2/protocol-examples-policies-deletepolicy.html
+++ b/1.2/protocol-examples-policies-deletepolicy.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-deletepolicyentry.html b/1.2/protocol-examples-policies-deletepolicyentry.html
index bd2509e..3c5665c 100644
--- a/1.2/protocol-examples-policies-deletepolicyentry.html
+++ b/1.2/protocol-examples-policies-deletepolicyentry.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-deleteresource.html b/1.2/protocol-examples-policies-deleteresource.html
index 7ac171e..a0f1b07 100644
--- a/1.2/protocol-examples-policies-deleteresource.html
+++ b/1.2/protocol-examples-policies-deleteresource.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-deletesubject.html b/1.2/protocol-examples-policies-deletesubject.html
index c24775c..6563cb7 100644
--- a/1.2/protocol-examples-policies-deletesubject.html
+++ b/1.2/protocol-examples-policies-deletesubject.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-errorresponses.html b/1.2/protocol-examples-policies-errorresponses.html
index e642772..bf77881 100644
--- a/1.2/protocol-examples-policies-errorresponses.html
+++ b/1.2/protocol-examples-policies-errorresponses.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifypolicy.html b/1.2/protocol-examples-policies-modifypolicy.html
index afc82a7..3386aa0 100644
--- a/1.2/protocol-examples-policies-modifypolicy.html
+++ b/1.2/protocol-examples-policies-modifypolicy.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifypolicyentries.html b/1.2/protocol-examples-policies-modifypolicyentries.html
index 8c6c0ea..3815a8d 100644
--- a/1.2/protocol-examples-policies-modifypolicyentries.html
+++ b/1.2/protocol-examples-policies-modifypolicyentries.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifypolicyentry.html b/1.2/protocol-examples-policies-modifypolicyentry.html
index b215a7b..8c9fc31 100644
--- a/1.2/protocol-examples-policies-modifypolicyentry.html
+++ b/1.2/protocol-examples-policies-modifypolicyentry.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifyresource.html b/1.2/protocol-examples-policies-modifyresource.html
index fd819fa..4148b80 100644
--- a/1.2/protocol-examples-policies-modifyresource.html
+++ b/1.2/protocol-examples-policies-modifyresource.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifyresources.html b/1.2/protocol-examples-policies-modifyresources.html
index 2835e86..80d734b 100644
--- a/1.2/protocol-examples-policies-modifyresources.html
+++ b/1.2/protocol-examples-policies-modifyresources.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifysubject.html b/1.2/protocol-examples-policies-modifysubject.html
index b14e181..8d247f0 100644
--- a/1.2/protocol-examples-policies-modifysubject.html
+++ b/1.2/protocol-examples-policies-modifysubject.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-modifysubjects.html b/1.2/protocol-examples-policies-modifysubjects.html
index 3545371..405afe6 100644
--- a/1.2/protocol-examples-policies-modifysubjects.html
+++ b/1.2/protocol-examples-policies-modifysubjects.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrievepolicy.html b/1.2/protocol-examples-policies-retrievepolicy.html
index a06a861..cf80edf 100644
--- a/1.2/protocol-examples-policies-retrievepolicy.html
+++ b/1.2/protocol-examples-policies-retrievepolicy.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrievepolicyentries.html b/1.2/protocol-examples-policies-retrievepolicyentries.html
index 4f61c53..a1a28f3 100644
--- a/1.2/protocol-examples-policies-retrievepolicyentries.html
+++ b/1.2/protocol-examples-policies-retrievepolicyentries.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrievepolicyentry.html b/1.2/protocol-examples-policies-retrievepolicyentry.html
index c72aa1f..6bd7621 100644
--- a/1.2/protocol-examples-policies-retrievepolicyentry.html
+++ b/1.2/protocol-examples-policies-retrievepolicyentry.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrieveresource.html b/1.2/protocol-examples-policies-retrieveresource.html
index 9a17852..1d7ee79 100644
--- a/1.2/protocol-examples-policies-retrieveresource.html
+++ b/1.2/protocol-examples-policies-retrieveresource.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrieveresources.html b/1.2/protocol-examples-policies-retrieveresources.html
index 56a01ce..4c265e9 100644
--- a/1.2/protocol-examples-policies-retrieveresources.html
+++ b/1.2/protocol-examples-policies-retrieveresources.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrievesubject.html b/1.2/protocol-examples-policies-retrievesubject.html
index 0784b4f..936a7ef 100644
--- a/1.2/protocol-examples-policies-retrievesubject.html
+++ b/1.2/protocol-examples-policies-retrievesubject.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-policies-retrievesubjects.html b/1.2/protocol-examples-policies-retrievesubjects.html
index edf8f33..c00f92f 100644
--- a/1.2/protocol-examples-policies-retrievesubjects.html
+++ b/1.2/protocol-examples-policies-retrievesubjects.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrieveattribute.html b/1.2/protocol-examples-retrieveattribute.html
index 5c80dd9..263c529 100644
--- a/1.2/protocol-examples-retrieveattribute.html
+++ b/1.2/protocol-examples-retrieveattribute.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrieveattributes.html b/1.2/protocol-examples-retrieveattributes.html
index 28384db..d02cc78 100644
--- a/1.2/protocol-examples-retrieveattributes.html
+++ b/1.2/protocol-examples-retrieveattributes.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievedefinition.html b/1.2/protocol-examples-retrievedefinition.html
index 372581d..921a066 100644
--- a/1.2/protocol-examples-retrievedefinition.html
+++ b/1.2/protocol-examples-retrievedefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievefeature.html b/1.2/protocol-examples-retrievefeature.html
index 945cd7e..dfc07d3 100644
--- a/1.2/protocol-examples-retrievefeature.html
+++ b/1.2/protocol-examples-retrievefeature.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievefeatures.html b/1.2/protocol-examples-retrievefeatures.html
index a745c62..88e687d 100644
--- a/1.2/protocol-examples-retrievefeatures.html
+++ b/1.2/protocol-examples-retrievefeatures.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrieveproperties.html b/1.2/protocol-examples-retrieveproperties.html
index 526185a..fa9a487 100644
--- a/1.2/protocol-examples-retrieveproperties.html
+++ b/1.2/protocol-examples-retrieveproperties.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrieveproperty.html b/1.2/protocol-examples-retrieveproperty.html
index a0670f3..a862979 100644
--- a/1.2/protocol-examples-retrieveproperty.html
+++ b/1.2/protocol-examples-retrieveproperty.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievething.html b/1.2/protocol-examples-retrievething.html
index 2f86ce6..416de42 100644
--- a/1.2/protocol-examples-retrievething.html
+++ b/1.2/protocol-examples-retrievething.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievethingdefinition.html b/1.2/protocol-examples-retrievethingdefinition.html
index 57bcdf9..82a65cc 100644
--- a/1.2/protocol-examples-retrievethingdefinition.html
+++ b/1.2/protocol-examples-retrievethingdefinition.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-retrievethings.html b/1.2/protocol-examples-retrievethings.html
index 2c66153..1502e1f 100644
--- a/1.2/protocol-examples-retrievethings.html
+++ b/1.2/protocol-examples-retrievethings.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples-search.html b/1.2/protocol-examples-search.html
index 2e7b2cd..df6559c 100644
--- a/1.2/protocol-examples-search.html
+++ b/1.2/protocol-examples-search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-examples.html b/1.2/protocol-examples.html
index 58a3078..6ac329f 100644
--- a/1.2/protocol-examples.html
+++ b/1.2/protocol-examples.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-overview.html b/1.2/protocol-overview.html
index 0bb39bc..56883fe 100644
--- a/1.2/protocol-overview.html
+++ b/1.2/protocol-overview.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-acks.html b/1.2/protocol-specification-acks.html
index 93208b8..3c785cc 100644
--- a/1.2/protocol-specification-acks.html
+++ b/1.2/protocol-specification-acks.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-errors.html b/1.2/protocol-specification-errors.html
index 99f6e66..c54814b 100644
--- a/1.2/protocol-specification-errors.html
+++ b/1.2/protocol-specification-errors.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-policies-create-or-modify.html b/1.2/protocol-specification-policies-create-or-modify.html
index 62fc947..106df0a 100644
--- a/1.2/protocol-specification-policies-create-or-modify.html
+++ b/1.2/protocol-specification-policies-create-or-modify.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-policies-delete.html b/1.2/protocol-specification-policies-delete.html
index 453a990..f27dafe 100644
--- a/1.2/protocol-specification-policies-delete.html
+++ b/1.2/protocol-specification-policies-delete.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-policies-retrieve.html b/1.2/protocol-specification-policies-retrieve.html
index feea683..7948c57 100644
--- a/1.2/protocol-specification-policies-retrieve.html
+++ b/1.2/protocol-specification-policies-retrieve.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-policies.html b/1.2/protocol-specification-policies.html
index e3ec40b..64bf138 100644
--- a/1.2/protocol-specification-policies.html
+++ b/1.2/protocol-specification-policies.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things-create-or-modify.html b/1.2/protocol-specification-things-create-or-modify.html
index 6fe977b..676634b 100644
--- a/1.2/protocol-specification-things-create-or-modify.html
+++ b/1.2/protocol-specification-things-create-or-modify.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things-delete.html b/1.2/protocol-specification-things-delete.html
index d36ac02..be5a884 100644
--- a/1.2/protocol-specification-things-delete.html
+++ b/1.2/protocol-specification-things-delete.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things-messages.html b/1.2/protocol-specification-things-messages.html
index 2936842..23546fd 100644
--- a/1.2/protocol-specification-things-messages.html
+++ b/1.2/protocol-specification-things-messages.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things-retrieve.html b/1.2/protocol-specification-things-retrieve.html
index 704c559..a620ae7 100644
--- a/1.2/protocol-specification-things-retrieve.html
+++ b/1.2/protocol-specification-things-retrieve.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things-search.html b/1.2/protocol-specification-things-search.html
index 607e0c2..4bba63b 100644
--- a/1.2/protocol-specification-things-search.html
+++ b/1.2/protocol-specification-things-search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-things.html b/1.2/protocol-specification-things.html
index 036216d..818afa1 100644
--- a/1.2/protocol-specification-things.html
+++ b/1.2/protocol-specification-things.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification-topic.html b/1.2/protocol-specification-topic.html
index 9cd09a4..547d887 100644
--- a/1.2/protocol-specification-topic.html
+++ b/1.2/protocol-specification-topic.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-specification.html b/1.2/protocol-specification.html
index 915ff44..8eb6a84 100644
--- a/1.2/protocol-specification.html
+++ b/1.2/protocol-specification.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/protocol-twinlive.html b/1.2/protocol-twinlive.html
index 1222750..b4bfbf8 100644
--- a/1.2/protocol-twinlive.html
+++ b/1.2/protocol-twinlive.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_010-M1.html b/1.2/release_notes_010-M1.html
index 4d42235..c72261d 100644
--- a/1.2/release_notes_010-M1.html
+++ b/1.2/release_notes_010-M1.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_010-M3.html b/1.2/release_notes_010-M3.html
index 33bd9ca..7a18fdf 100644
--- a/1.2/release_notes_010-M3.html
+++ b/1.2/release_notes_010-M3.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_020-M1.html b/1.2/release_notes_020-M1.html
index bf37091..b8ee1b6 100644
--- a/1.2/release_notes_020-M1.html
+++ b/1.2/release_notes_020-M1.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_030-M1.html b/1.2/release_notes_030-M1.html
index 6d134f6..acafa84 100644
--- a/1.2/release_notes_030-M1.html
+++ b/1.2/release_notes_030-M1.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_030-M2.html b/1.2/release_notes_030-M2.html
index d4035eb..6b56c26 100644
--- a/1.2/release_notes_030-M2.html
+++ b/1.2/release_notes_030-M2.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_080-M1.html b/1.2/release_notes_080-M1.html
index 3fafc68..b67b017 100644
--- a/1.2/release_notes_080-M1.html
+++ b/1.2/release_notes_080-M1.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_080-M2.html b/1.2/release_notes_080-M2.html
index 43beb10..64713a1 100644
--- a/1.2/release_notes_080-M2.html
+++ b/1.2/release_notes_080-M2.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_080-M3.html b/1.2/release_notes_080-M3.html
index 34a10be..be0868c 100644
--- a/1.2/release_notes_080-M3.html
+++ b/1.2/release_notes_080-M3.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_080.html b/1.2/release_notes_080.html
index 9f0833b..8e2c968 100644
--- a/1.2/release_notes_080.html
+++ b/1.2/release_notes_080.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_090-M1.html b/1.2/release_notes_090-M1.html
index 942d53f..04bfc7a 100644
--- a/1.2/release_notes_090-M1.html
+++ b/1.2/release_notes_090-M1.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_090-M2.html b/1.2/release_notes_090-M2.html
index 1f32101..3f306f4 100644
--- a/1.2/release_notes_090-M2.html
+++ b/1.2/release_notes_090-M2.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_090.html b/1.2/release_notes_090.html
index 32fe836..54cb13e 100644
--- a/1.2/release_notes_090.html
+++ b/1.2/release_notes_090.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_100-M1a.html b/1.2/release_notes_100-M1a.html
index 8e7629b..8a3c82b 100644
--- a/1.2/release_notes_100-M1a.html
+++ b/1.2/release_notes_100-M1a.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_100-M2.html b/1.2/release_notes_100-M2.html
index 4329b3b..16653fd 100644
--- a/1.2/release_notes_100-M2.html
+++ b/1.2/release_notes_100-M2.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_100.html b/1.2/release_notes_100.html
index 90f6381..8d2e6d6 100644
--- a/1.2/release_notes_100.html
+++ b/1.2/release_notes_100.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_110.html b/1.2/release_notes_110.html
index 9cf14a2..eb2d803 100644
--- a/1.2/release_notes_110.html
+++ b/1.2/release_notes_110.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_111.html b/1.2/release_notes_111.html
index 2288bfb..8ebe978 100644
--- a/1.2/release_notes_111.html
+++ b/1.2/release_notes_111.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_112.html b/1.2/release_notes_112.html
index 92cbe37..b8242b0 100644
--- a/1.2/release_notes_112.html
+++ b/1.2/release_notes_112.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_113.html b/1.2/release_notes_113.html
index 3228a48..1201d26 100644
--- a/1.2/release_notes_113.html
+++ b/1.2/release_notes_113.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_115.html b/1.2/release_notes_115.html
index 5089b9e..ed2400c 100644
--- a/1.2/release_notes_115.html
+++ b/1.2/release_notes_115.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_120.html b/1.2/release_notes_120.html
index 3f19b6f..844a289 100644
--- a/1.2/release_notes_120.html
+++ b/1.2/release_notes_120.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/release_notes_121.html b/1.2/release_notes_121.html
index 571f7ea..576482b 100644
--- a/1.2/release_notes_121.html
+++ b/1.2/release_notes_121.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/sandbox.html b/1.2/sandbox.html
index baf7e68..35ccd98 100644
--- a/1.2/sandbox.html
+++ b/1.2/sandbox.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_architecture.html b/1.2/tag_architecture.html
index ce9d1de..5c97b7d 100644
--- a/1.2/tag_architecture.html
+++ b/1.2/tag_architecture.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_blog.html b/1.2/tag_blog.html
index 9015621..10ec4b7 100644
--- a/1.2/tag_blog.html
+++ b/1.2/tag_blog.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_client_sdk.html b/1.2/tag_client_sdk.html
index 195f6bf..6dd9d44 100644
--- a/1.2/tag_client_sdk.html
+++ b/1.2/tag_client_sdk.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_connectivity.html b/1.2/tag_connectivity.html
index a5f8f6b..ba3c097 100644
--- a/1.2/tag_connectivity.html
+++ b/1.2/tag_connectivity.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_getting_started.html b/1.2/tag_getting_started.html
index 1fc5eef..1f65cae 100644
--- a/1.2/tag_getting_started.html
+++ b/1.2/tag_getting_started.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_http.html b/1.2/tag_http.html
index aef33ec..da73cb6 100644
--- a/1.2/tag_http.html
+++ b/1.2/tag_http.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_installation.html b/1.2/tag_installation.html
index 71e7516..0f631ff 100644
--- a/1.2/tag_installation.html
+++ b/1.2/tag_installation.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_model.html b/1.2/tag_model.html
index 04a082d..6e0a946 100644
--- a/1.2/tag_model.html
+++ b/1.2/tag_model.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_news.html b/1.2/tag_news.html
index b0c825e..ec7e680 100644
--- a/1.2/tag_news.html
+++ b/1.2/tag_news.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_protocol.html b/1.2/tag_protocol.html
index 099042f..b3922c5 100644
--- a/1.2/tag_protocol.html
+++ b/1.2/tag_protocol.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_release_notes.html b/1.2/tag_release_notes.html
index 3d20d32..c3491d7 100644
--- a/1.2/tag_release_notes.html
+++ b/1.2/tag_release_notes.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_rql.html b/1.2/tag_rql.html
index 0e699b2..0910d7b 100644
--- a/1.2/tag_rql.html
+++ b/1.2/tag_rql.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_search.html b/1.2/tag_search.html
index 1fb1adf..8fc3ac4 100644
--- a/1.2/tag_search.html
+++ b/1.2/tag_search.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_signal.html b/1.2/tag_signal.html
index 3726cf3..89476ef 100644
--- a/1.2/tag_signal.html
+++ b/1.2/tag_signal.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.2/tag_troubleshooting.html b/1.2/tag_troubleshooting.html
index 630ff3f..0f58ea1 100644
--- a/1.2/tag_troubleshooting.html
+++ b/1.2/tag_troubleshooting.html
@@ -206,6 +206,10 @@
         
         <option value="1.2">1.2</option>
         
+        <option value="1.3">1.3</option>
+        
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1440,48 +1444,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/404.html b/1.3/404.html
index 8c482ce..3025b71 100644
--- a/1.3/404.html
+++ b/1.3/404.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-overview.html b/1.3/architecture-overview.html
index 8f99c74..4bcc56c 100644
--- a/1.3/architecture-overview.html
+++ b/1.3/architecture-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-concierge.html b/1.3/architecture-services-concierge.html
index c222169..3ce912c 100644
--- a/1.3/architecture-services-concierge.html
+++ b/1.3/architecture-services-concierge.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-connectivity.html b/1.3/architecture-services-connectivity.html
index 3e1bbc5..d688065 100644
--- a/1.3/architecture-services-connectivity.html
+++ b/1.3/architecture-services-connectivity.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-gateway.html b/1.3/architecture-services-gateway.html
index bb2f722..75d5c71 100644
--- a/1.3/architecture-services-gateway.html
+++ b/1.3/architecture-services-gateway.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-policies.html b/1.3/architecture-services-policies.html
index 1885578..bd85a5c 100644
--- a/1.3/architecture-services-policies.html
+++ b/1.3/architecture-services-policies.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-things-search.html b/1.3/architecture-services-things-search.html
index 5d3ef70..5541e79 100644
--- a/1.3/architecture-services-things-search.html
+++ b/1.3/architecture-services-things-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/architecture-services-things.html b/1.3/architecture-services-things.html
index e4bb4f0..df92300 100644
--- a/1.3/architecture-services-things.html
+++ b/1.3/architecture-services-things.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-acknowledgements.html b/1.3/basic-acknowledgements.html
index 31f3838..ce030bd 100644
--- a/1.3/basic-acknowledgements.html
+++ b/1.3/basic-acknowledgements.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-acl.html b/1.3/basic-acl.html
index 0879b3f..99de26c 100644
--- a/1.3/basic-acl.html
+++ b/1.3/basic-acl.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-apis.html b/1.3/basic-apis.html
index e3f4f9a..14ff7b3 100644
--- a/1.3/basic-apis.html
+++ b/1.3/basic-apis.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-auth.html b/1.3/basic-auth.html
index f1929d2..8e4f692 100644
--- a/1.3/basic-auth.html
+++ b/1.3/basic-auth.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-changenotifications.html b/1.3/basic-changenotifications.html
index fcc3aa2..f3827d1 100644
--- a/1.3/basic-changenotifications.html
+++ b/1.3/basic-changenotifications.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-connections.html b/1.3/basic-connections.html
index 8eb4d51..4330098 100644
--- a/1.3/basic-connections.html
+++ b/1.3/basic-connections.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-enrichment.html b/1.3/basic-enrichment.html
index 0bc5af5..9d8d41a 100644
--- a/1.3/basic-enrichment.html
+++ b/1.3/basic-enrichment.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-errors.html b/1.3/basic-errors.html
index 2020707..96770b5 100644
--- a/1.3/basic-errors.html
+++ b/1.3/basic-errors.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-feature.html b/1.3/basic-feature.html
index 3dc241f..a81bec9 100644
--- a/1.3/basic-feature.html
+++ b/1.3/basic-feature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-messages.html b/1.3/basic-messages.html
index 7fa5141..7cec30f 100644
--- a/1.3/basic-messages.html
+++ b/1.3/basic-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-metadata.html b/1.3/basic-metadata.html
index eae47d1..b18fc6a 100644
--- a/1.3/basic-metadata.html
+++ b/1.3/basic-metadata.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-namespaces-and-names.html b/1.3/basic-namespaces-and-names.html
index f8b385c..be05b16 100644
--- a/1.3/basic-namespaces-and-names.html
+++ b/1.3/basic-namespaces-and-names.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-overview.html b/1.3/basic-overview.html
index 56025d2..7373f91 100644
--- a/1.3/basic-overview.html
+++ b/1.3/basic-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-placeholders.html b/1.3/basic-placeholders.html
index d272174..bfdc2c2 100644
--- a/1.3/basic-placeholders.html
+++ b/1.3/basic-placeholders.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-policy.html b/1.3/basic-policy.html
index eb34350..7d572fc 100644
--- a/1.3/basic-policy.html
+++ b/1.3/basic-policy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-rql.html b/1.3/basic-rql.html
index 39c24ef..7e53923 100644
--- a/1.3/basic-rql.html
+++ b/1.3/basic-rql.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-search.html b/1.3/basic-search.html
index 2b2d56d..4999c12 100644
--- a/1.3/basic-search.html
+++ b/1.3/basic-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-signals-command.html b/1.3/basic-signals-command.html
index d429b89..5f5bb79 100644
--- a/1.3/basic-signals-command.html
+++ b/1.3/basic-signals-command.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-signals-commandresponse.html b/1.3/basic-signals-commandresponse.html
index f3fe141..f1c180d 100644
--- a/1.3/basic-signals-commandresponse.html
+++ b/1.3/basic-signals-commandresponse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-signals-errorresponse.html b/1.3/basic-signals-errorresponse.html
index 1b32061..118edc1 100644
--- a/1.3/basic-signals-errorresponse.html
+++ b/1.3/basic-signals-errorresponse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-signals-event.html b/1.3/basic-signals-event.html
index 23f1c2d..8918106 100644
--- a/1.3/basic-signals-event.html
+++ b/1.3/basic-signals-event.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-signals.html b/1.3/basic-signals.html
index 92859fd..ce5121f 100644
--- a/1.3/basic-signals.html
+++ b/1.3/basic-signals.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/basic-thing.html b/1.3/basic-thing.html
index 510b2f5..23b7158 100644
--- a/1.3/basic-thing.html
+++ b/1.3/basic-thing.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/client-sdk-java.html b/1.3/client-sdk-java.html
index d800414..4681386 100644
--- a/1.3/client-sdk-java.html
+++ b/1.3/client-sdk-java.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/client-sdk-javascript.html b/1.3/client-sdk-javascript.html
index 60119c1..277df56 100644
--- a/1.3/client-sdk-javascript.html
+++ b/1.3/client-sdk-javascript.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/client-sdk-overview.html b/1.3/client-sdk-overview.html
index d2f5d47..c6e9ad5 100644
--- a/1.3/client-sdk-overview.html
+++ b/1.3/client-sdk-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-header-mapping.html b/1.3/connectivity-header-mapping.html
index fd936ff..477bd63 100644
--- a/1.3/connectivity-header-mapping.html
+++ b/1.3/connectivity-header-mapping.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-manage-connections.html b/1.3/connectivity-manage-connections.html
index 95212c9..009cb95 100644
--- a/1.3/connectivity-manage-connections.html
+++ b/1.3/connectivity-manage-connections.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-mapping.html b/1.3/connectivity-mapping.html
index 5e5c5e4..113b2d9 100644
--- a/1.3/connectivity-mapping.html
+++ b/1.3/connectivity-mapping.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-overview.html b/1.3/connectivity-overview.html
index 8ececcb..f8e2bee 100644
--- a/1.3/connectivity-overview.html
+++ b/1.3/connectivity-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-amqp091.html b/1.3/connectivity-protocol-bindings-amqp091.html
index 3bd62a7..a0ca65d 100644
--- a/1.3/connectivity-protocol-bindings-amqp091.html
+++ b/1.3/connectivity-protocol-bindings-amqp091.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-amqp10.html b/1.3/connectivity-protocol-bindings-amqp10.html
index 0893b93..c84545e 100644
--- a/1.3/connectivity-protocol-bindings-amqp10.html
+++ b/1.3/connectivity-protocol-bindings-amqp10.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-http.html b/1.3/connectivity-protocol-bindings-http.html
index c722f25..03a796f 100644
--- a/1.3/connectivity-protocol-bindings-http.html
+++ b/1.3/connectivity-protocol-bindings-http.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-kafka2.html b/1.3/connectivity-protocol-bindings-kafka2.html
index 6c04e3a..cb9845e 100644
--- a/1.3/connectivity-protocol-bindings-kafka2.html
+++ b/1.3/connectivity-protocol-bindings-kafka2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-mqtt.html b/1.3/connectivity-protocol-bindings-mqtt.html
index e877971..4fd8079 100644
--- a/1.3/connectivity-protocol-bindings-mqtt.html
+++ b/1.3/connectivity-protocol-bindings-mqtt.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-protocol-bindings-mqtt5.html b/1.3/connectivity-protocol-bindings-mqtt5.html
index 998ab38..12a7639 100644
--- a/1.3/connectivity-protocol-bindings-mqtt5.html
+++ b/1.3/connectivity-protocol-bindings-mqtt5.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/connectivity-tls-certificates.html b/1.3/connectivity-tls-certificates.html
index b0bb7bd..17a2296 100644
--- a/1.3/connectivity-tls-certificates.html
+++ b/1.3/connectivity-tls-certificates.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/feedback.html b/1.3/feedback.html
index 0484f80..935bf84 100644
--- a/1.3/feedback.html
+++ b/1.3/feedback.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/glossary.html b/1.3/glossary.html
index b5f43fc..cd75a1f 100644
--- a/1.3/glossary.html
+++ b/1.3/glossary.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-concepts.html b/1.3/httpapi-concepts.html
index cd4cc04..29de949 100644
--- a/1.3/httpapi-concepts.html
+++ b/1.3/httpapi-concepts.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-messages.html b/1.3/httpapi-messages.html
index e136b7d..cd754db 100644
--- a/1.3/httpapi-messages.html
+++ b/1.3/httpapi-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-overview.html b/1.3/httpapi-overview.html
index 1110d60..09e2c86 100644
--- a/1.3/httpapi-overview.html
+++ b/1.3/httpapi-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-protocol-bindings-websocket.html b/1.3/httpapi-protocol-bindings-websocket.html
index 3eaffd6..ec21931 100644
--- a/1.3/httpapi-protocol-bindings-websocket.html
+++ b/1.3/httpapi-protocol-bindings-websocket.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-search.html b/1.3/httpapi-search.html
index 6f89c17..2efdd6a 100644
--- a/1.3/httpapi-search.html
+++ b/1.3/httpapi-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/httpapi-sse.html b/1.3/httpapi-sse.html
index 23894b7..95d853e 100644
--- a/1.3/httpapi-sse.html
+++ b/1.3/httpapi-sse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/installation-building.html b/1.3/installation-building.html
index 144b562..884beea 100644
--- a/1.3/installation-building.html
+++ b/1.3/installation-building.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/installation-operating.html b/1.3/installation-operating.html
index 39241ed..79f88da 100644
--- a/1.3/installation-operating.html
+++ b/1.3/installation-operating.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/installation-running.html b/1.3/installation-running.html
index 62bc51b..1f6a771 100644
--- a/1.3/installation-running.html
+++ b/1.3/installation-running.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/intro-digitaltwins.html b/1.3/intro-digitaltwins.html
index 7b2e5ae..76b9a9d 100644
--- a/1.3/intro-digitaltwins.html
+++ b/1.3/intro-digitaltwins.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/intro-hello-world.html b/1.3/intro-hello-world.html
index f0e168e..b9faa2c 100644
--- a/1.3/intro-hello-world.html
+++ b/1.3/intro-hello-world.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/intro-overview.html b/1.3/intro-overview.html
index b174b24..c1b8a98 100644
--- a/1.3/intro-overview.html
+++ b/1.3/intro-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/js/customscripts.js b/1.3/js/customscripts.js
index 96aff54..c45cdb9 100644
--- a/1.3/js/customscripts.js
+++ b/1.3/js/customscripts.js
@@ -34,4 +34,46 @@
         });
 
     });
+
+    $("#dev-warning").hide();
+    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
+    $("#docVersion").change(changeSelectedDocVersion);
 });
+
+function changeSelectedDocVersionDropdownSelection(element) {
+    var pathName = window.location.pathname;
+
+    var versionOptions = element.options;
+    for (var i = 0; i < versionOptions.length; i++) {
+        var versionValue = versionOptions[i].value;
+        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
+            $("#docVersion").val(versionValue).change();
+            return;
+        }
+    }
+    // fallback: dev with "empty" version value:
+    $("#docVersion").val("").change();
+    $("#dev-warning").show();
+}
+
+function changeSelectedDocVersion() {
+    var versionValue = $('#docVersion').val();
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
+    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
+    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
+    if (versionValue === "" && !versionMatch) {
+        // do nothing, we're already on the correct "dev" version
+    } else if (versionMatch && (versionValue === versionMatch[1])) {
+        // do nothing, we're already on the correct version
+    } else {
+        if (versionValue === "" && versionMatch) {
+            window.location.pathname = "ditto/" + versionMatch[2];
+        } else if (versionValue === "") {
+            window.location.pathname = "ditto/" + remainingPath;
+        } else if (versionMatch) {
+            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
+        } else {
+            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
+        }
+    }
+}
diff --git a/1.3/presentations.html b/1.3/presentations.html
index a3b1da8..facfe62 100644
--- a/1.3/presentations.html
+++ b/1.3/presentations.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-bindings.html b/1.3/protocol-bindings.html
index 565aad3..5a26c7c 100644
--- a/1.3/protocol-bindings.html
+++ b/1.3/protocol-bindings.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createattribute.html b/1.3/protocol-examples-createattribute.html
index 0b87aef..f9ccd21 100644
--- a/1.3/protocol-examples-createattribute.html
+++ b/1.3/protocol-examples-createattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createattributes.html b/1.3/protocol-examples-createattributes.html
index 8009f79..2063cb6 100644
--- a/1.3/protocol-examples-createattributes.html
+++ b/1.3/protocol-examples-createattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createdefinition.html b/1.3/protocol-examples-createdefinition.html
index c727021..ffe7728 100644
--- a/1.3/protocol-examples-createdefinition.html
+++ b/1.3/protocol-examples-createdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createfeature.html b/1.3/protocol-examples-createfeature.html
index 88c4421..e8d59b3 100644
--- a/1.3/protocol-examples-createfeature.html
+++ b/1.3/protocol-examples-createfeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createfeatures.html b/1.3/protocol-examples-createfeatures.html
index 02d5726..931686c 100644
--- a/1.3/protocol-examples-createfeatures.html
+++ b/1.3/protocol-examples-createfeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createproperties.html b/1.3/protocol-examples-createproperties.html
index 1d81d52..cb5dfdd 100644
--- a/1.3/protocol-examples-createproperties.html
+++ b/1.3/protocol-examples-createproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createproperty.html b/1.3/protocol-examples-createproperty.html
index 2d07c3e..216bc93 100644
--- a/1.3/protocol-examples-createproperty.html
+++ b/1.3/protocol-examples-createproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-creatething.html b/1.3/protocol-examples-creatething.html
index 5fd02e7..a1f1703 100644
--- a/1.3/protocol-examples-creatething.html
+++ b/1.3/protocol-examples-creatething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-createthingdefinition.html b/1.3/protocol-examples-createthingdefinition.html
index b17d36b..e7de0c3 100644
--- a/1.3/protocol-examples-createthingdefinition.html
+++ b/1.3/protocol-examples-createthingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deleteattribute.html b/1.3/protocol-examples-deleteattribute.html
index 11bc694..662ff6c 100644
--- a/1.3/protocol-examples-deleteattribute.html
+++ b/1.3/protocol-examples-deleteattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deleteattributes.html b/1.3/protocol-examples-deleteattributes.html
index 5441972..203e49c 100644
--- a/1.3/protocol-examples-deleteattributes.html
+++ b/1.3/protocol-examples-deleteattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deletedefinition.html b/1.3/protocol-examples-deletedefinition.html
index 0d507c8..c837461 100644
--- a/1.3/protocol-examples-deletedefinition.html
+++ b/1.3/protocol-examples-deletedefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deletefeature.html b/1.3/protocol-examples-deletefeature.html
index 9cda820..1f98869 100644
--- a/1.3/protocol-examples-deletefeature.html
+++ b/1.3/protocol-examples-deletefeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deletefeatures.html b/1.3/protocol-examples-deletefeatures.html
index cddbe0e..dc3a5da 100644
--- a/1.3/protocol-examples-deletefeatures.html
+++ b/1.3/protocol-examples-deletefeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deleteproperties.html b/1.3/protocol-examples-deleteproperties.html
index 05f81c2..7f41932 100644
--- a/1.3/protocol-examples-deleteproperties.html
+++ b/1.3/protocol-examples-deleteproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deleteproperty.html b/1.3/protocol-examples-deleteproperty.html
index 6b2ab92..a5f03ee 100644
--- a/1.3/protocol-examples-deleteproperty.html
+++ b/1.3/protocol-examples-deleteproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deletething.html b/1.3/protocol-examples-deletething.html
index 60ab532..b8bbe5d 100644
--- a/1.3/protocol-examples-deletething.html
+++ b/1.3/protocol-examples-deletething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-deletethingdefinition.html b/1.3/protocol-examples-deletethingdefinition.html
index bcf5b80..a075db1 100644
--- a/1.3/protocol-examples-deletethingdefinition.html
+++ b/1.3/protocol-examples-deletethingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-errorresponses.html b/1.3/protocol-examples-errorresponses.html
index 8b97284..459439c 100644
--- a/1.3/protocol-examples-errorresponses.html
+++ b/1.3/protocol-examples-errorresponses.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyattribute.html b/1.3/protocol-examples-modifyattribute.html
index 92ce7af..c5d428c 100644
--- a/1.3/protocol-examples-modifyattribute.html
+++ b/1.3/protocol-examples-modifyattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyattributes.html b/1.3/protocol-examples-modifyattributes.html
index 43398fa..721c8be 100644
--- a/1.3/protocol-examples-modifyattributes.html
+++ b/1.3/protocol-examples-modifyattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifydefinition.html b/1.3/protocol-examples-modifydefinition.html
index 280f939..8a669e8 100644
--- a/1.3/protocol-examples-modifydefinition.html
+++ b/1.3/protocol-examples-modifydefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyfeature.html b/1.3/protocol-examples-modifyfeature.html
index 0eda7bb..743827e 100644
--- a/1.3/protocol-examples-modifyfeature.html
+++ b/1.3/protocol-examples-modifyfeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyfeatures.html b/1.3/protocol-examples-modifyfeatures.html
index da90e1a..8cddcf8 100644
--- a/1.3/protocol-examples-modifyfeatures.html
+++ b/1.3/protocol-examples-modifyfeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifypolicyid.html b/1.3/protocol-examples-modifypolicyid.html
index 0d2078c..4526b3c 100644
--- a/1.3/protocol-examples-modifypolicyid.html
+++ b/1.3/protocol-examples-modifypolicyid.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyproperties.html b/1.3/protocol-examples-modifyproperties.html
index 8236218..7e5b329 100644
--- a/1.3/protocol-examples-modifyproperties.html
+++ b/1.3/protocol-examples-modifyproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifyproperty.html b/1.3/protocol-examples-modifyproperty.html
index 1201647..5a2b203 100644
--- a/1.3/protocol-examples-modifyproperty.html
+++ b/1.3/protocol-examples-modifyproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifything.html b/1.3/protocol-examples-modifything.html
index 2a270b7..bf5c670 100644
--- a/1.3/protocol-examples-modifything.html
+++ b/1.3/protocol-examples-modifything.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-modifythingdefinition.html b/1.3/protocol-examples-modifythingdefinition.html
index 0c859db..55a924b 100644
--- a/1.3/protocol-examples-modifythingdefinition.html
+++ b/1.3/protocol-examples-modifythingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-createpolicy.html b/1.3/protocol-examples-policies-createpolicy.html
index a606b15..58ba076 100644
--- a/1.3/protocol-examples-policies-createpolicy.html
+++ b/1.3/protocol-examples-policies-createpolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-createpolicyentry.html b/1.3/protocol-examples-policies-createpolicyentry.html
index db12209..076d22a 100644
--- a/1.3/protocol-examples-policies-createpolicyentry.html
+++ b/1.3/protocol-examples-policies-createpolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-createresource.html b/1.3/protocol-examples-policies-createresource.html
index fe27112..98bb718 100644
--- a/1.3/protocol-examples-policies-createresource.html
+++ b/1.3/protocol-examples-policies-createresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-createsubject.html b/1.3/protocol-examples-policies-createsubject.html
index e66a4c6..69a5a24 100644
--- a/1.3/protocol-examples-policies-createsubject.html
+++ b/1.3/protocol-examples-policies-createsubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-deletepolicy.html b/1.3/protocol-examples-policies-deletepolicy.html
index 4c4eef2..319718f 100644
--- a/1.3/protocol-examples-policies-deletepolicy.html
+++ b/1.3/protocol-examples-policies-deletepolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-deletepolicyentry.html b/1.3/protocol-examples-policies-deletepolicyentry.html
index 6ac8cce..eb91bca 100644
--- a/1.3/protocol-examples-policies-deletepolicyentry.html
+++ b/1.3/protocol-examples-policies-deletepolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-deleteresource.html b/1.3/protocol-examples-policies-deleteresource.html
index 20b6cd5..ea3af26 100644
--- a/1.3/protocol-examples-policies-deleteresource.html
+++ b/1.3/protocol-examples-policies-deleteresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-deletesubject.html b/1.3/protocol-examples-policies-deletesubject.html
index ff6c1ec..407b4d8 100644
--- a/1.3/protocol-examples-policies-deletesubject.html
+++ b/1.3/protocol-examples-policies-deletesubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-errorresponses.html b/1.3/protocol-examples-policies-errorresponses.html
index 1962530..a5c162c 100644
--- a/1.3/protocol-examples-policies-errorresponses.html
+++ b/1.3/protocol-examples-policies-errorresponses.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifypolicy.html b/1.3/protocol-examples-policies-modifypolicy.html
index a971836..5d3b186 100644
--- a/1.3/protocol-examples-policies-modifypolicy.html
+++ b/1.3/protocol-examples-policies-modifypolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifypolicyentries.html b/1.3/protocol-examples-policies-modifypolicyentries.html
index 53e3e17..59e1623 100644
--- a/1.3/protocol-examples-policies-modifypolicyentries.html
+++ b/1.3/protocol-examples-policies-modifypolicyentries.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifypolicyentry.html b/1.3/protocol-examples-policies-modifypolicyentry.html
index 5a6fd7c..844794d 100644
--- a/1.3/protocol-examples-policies-modifypolicyentry.html
+++ b/1.3/protocol-examples-policies-modifypolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifyresource.html b/1.3/protocol-examples-policies-modifyresource.html
index 83b23b3..592d49f 100644
--- a/1.3/protocol-examples-policies-modifyresource.html
+++ b/1.3/protocol-examples-policies-modifyresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifyresources.html b/1.3/protocol-examples-policies-modifyresources.html
index 6aae765..c95ff95 100644
--- a/1.3/protocol-examples-policies-modifyresources.html
+++ b/1.3/protocol-examples-policies-modifyresources.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifysubject.html b/1.3/protocol-examples-policies-modifysubject.html
index c45e9b6..48c8632 100644
--- a/1.3/protocol-examples-policies-modifysubject.html
+++ b/1.3/protocol-examples-policies-modifysubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-modifysubjects.html b/1.3/protocol-examples-policies-modifysubjects.html
index b7e5850..441ae80 100644
--- a/1.3/protocol-examples-policies-modifysubjects.html
+++ b/1.3/protocol-examples-policies-modifysubjects.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrievepolicy.html b/1.3/protocol-examples-policies-retrievepolicy.html
index 0a3bf38..2c0f58b 100644
--- a/1.3/protocol-examples-policies-retrievepolicy.html
+++ b/1.3/protocol-examples-policies-retrievepolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrievepolicyentries.html b/1.3/protocol-examples-policies-retrievepolicyentries.html
index e9fc826..acee876 100644
--- a/1.3/protocol-examples-policies-retrievepolicyentries.html
+++ b/1.3/protocol-examples-policies-retrievepolicyentries.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrievepolicyentry.html b/1.3/protocol-examples-policies-retrievepolicyentry.html
index 07208e1..22f96f1 100644
--- a/1.3/protocol-examples-policies-retrievepolicyentry.html
+++ b/1.3/protocol-examples-policies-retrievepolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrieveresource.html b/1.3/protocol-examples-policies-retrieveresource.html
index a8231fa..09c94e5 100644
--- a/1.3/protocol-examples-policies-retrieveresource.html
+++ b/1.3/protocol-examples-policies-retrieveresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrieveresources.html b/1.3/protocol-examples-policies-retrieveresources.html
index c3c7ed2..52af5cd 100644
--- a/1.3/protocol-examples-policies-retrieveresources.html
+++ b/1.3/protocol-examples-policies-retrieveresources.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrievesubject.html b/1.3/protocol-examples-policies-retrievesubject.html
index aeda0dc..10f1b06 100644
--- a/1.3/protocol-examples-policies-retrievesubject.html
+++ b/1.3/protocol-examples-policies-retrievesubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-policies-retrievesubjects.html b/1.3/protocol-examples-policies-retrievesubjects.html
index 3119dff..036f124 100644
--- a/1.3/protocol-examples-policies-retrievesubjects.html
+++ b/1.3/protocol-examples-policies-retrievesubjects.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrieveattribute.html b/1.3/protocol-examples-retrieveattribute.html
index 219b3d4..c34b8d3 100644
--- a/1.3/protocol-examples-retrieveattribute.html
+++ b/1.3/protocol-examples-retrieveattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrieveattributes.html b/1.3/protocol-examples-retrieveattributes.html
index 2c3d0c2..fc4afb2 100644
--- a/1.3/protocol-examples-retrieveattributes.html
+++ b/1.3/protocol-examples-retrieveattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievedefinition.html b/1.3/protocol-examples-retrievedefinition.html
index 2eb16c4..7fb2816 100644
--- a/1.3/protocol-examples-retrievedefinition.html
+++ b/1.3/protocol-examples-retrievedefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievefeature.html b/1.3/protocol-examples-retrievefeature.html
index 97fec1a..c1049d1 100644
--- a/1.3/protocol-examples-retrievefeature.html
+++ b/1.3/protocol-examples-retrievefeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievefeatures.html b/1.3/protocol-examples-retrievefeatures.html
index 23ac219..cf7b36c 100644
--- a/1.3/protocol-examples-retrievefeatures.html
+++ b/1.3/protocol-examples-retrievefeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrieveproperties.html b/1.3/protocol-examples-retrieveproperties.html
index 3534a58..9611c4b 100644
--- a/1.3/protocol-examples-retrieveproperties.html
+++ b/1.3/protocol-examples-retrieveproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrieveproperty.html b/1.3/protocol-examples-retrieveproperty.html
index 5897e5d..43435b6 100644
--- a/1.3/protocol-examples-retrieveproperty.html
+++ b/1.3/protocol-examples-retrieveproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievething.html b/1.3/protocol-examples-retrievething.html
index fc0b86e..297273d 100644
--- a/1.3/protocol-examples-retrievething.html
+++ b/1.3/protocol-examples-retrievething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievethingdefinition.html b/1.3/protocol-examples-retrievethingdefinition.html
index 11aa93f..dc54d41 100644
--- a/1.3/protocol-examples-retrievethingdefinition.html
+++ b/1.3/protocol-examples-retrievethingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-retrievethings.html b/1.3/protocol-examples-retrievethings.html
index c62c2ce..26425b3 100644
--- a/1.3/protocol-examples-retrievethings.html
+++ b/1.3/protocol-examples-retrievethings.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples-search.html b/1.3/protocol-examples-search.html
index 47301bf..6436937 100644
--- a/1.3/protocol-examples-search.html
+++ b/1.3/protocol-examples-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-examples.html b/1.3/protocol-examples.html
index 4a7c623..8527d02 100644
--- a/1.3/protocol-examples.html
+++ b/1.3/protocol-examples.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-overview.html b/1.3/protocol-overview.html
index e59d270..6692b68 100644
--- a/1.3/protocol-overview.html
+++ b/1.3/protocol-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-acks.html b/1.3/protocol-specification-acks.html
index 203e5ce..c05c0f2 100644
--- a/1.3/protocol-specification-acks.html
+++ b/1.3/protocol-specification-acks.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-errors.html b/1.3/protocol-specification-errors.html
index e5d8574..ff803f6 100644
--- a/1.3/protocol-specification-errors.html
+++ b/1.3/protocol-specification-errors.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-policies-create-or-modify.html b/1.3/protocol-specification-policies-create-or-modify.html
index 5bfbe5c..4980f63 100644
--- a/1.3/protocol-specification-policies-create-or-modify.html
+++ b/1.3/protocol-specification-policies-create-or-modify.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-policies-delete.html b/1.3/protocol-specification-policies-delete.html
index efcaa50..94fb83b 100644
--- a/1.3/protocol-specification-policies-delete.html
+++ b/1.3/protocol-specification-policies-delete.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-policies-retrieve.html b/1.3/protocol-specification-policies-retrieve.html
index 335349e..b7a982e 100644
--- a/1.3/protocol-specification-policies-retrieve.html
+++ b/1.3/protocol-specification-policies-retrieve.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-policies.html b/1.3/protocol-specification-policies.html
index 045ef96..760bba8 100644
--- a/1.3/protocol-specification-policies.html
+++ b/1.3/protocol-specification-policies.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things-create-or-modify.html b/1.3/protocol-specification-things-create-or-modify.html
index 04d6e94..66d6df6 100644
--- a/1.3/protocol-specification-things-create-or-modify.html
+++ b/1.3/protocol-specification-things-create-or-modify.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things-delete.html b/1.3/protocol-specification-things-delete.html
index da0d215..3d78c5c 100644
--- a/1.3/protocol-specification-things-delete.html
+++ b/1.3/protocol-specification-things-delete.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things-messages.html b/1.3/protocol-specification-things-messages.html
index 7a5d1e6..0fbaf05 100644
--- a/1.3/protocol-specification-things-messages.html
+++ b/1.3/protocol-specification-things-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things-retrieve.html b/1.3/protocol-specification-things-retrieve.html
index b0dd16d..311967a 100644
--- a/1.3/protocol-specification-things-retrieve.html
+++ b/1.3/protocol-specification-things-retrieve.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things-search.html b/1.3/protocol-specification-things-search.html
index 0880ef7..48707f1 100644
--- a/1.3/protocol-specification-things-search.html
+++ b/1.3/protocol-specification-things-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-things.html b/1.3/protocol-specification-things.html
index 44ff02d..cb54678 100644
--- a/1.3/protocol-specification-things.html
+++ b/1.3/protocol-specification-things.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification-topic.html b/1.3/protocol-specification-topic.html
index 5af75a5..a81dffb 100644
--- a/1.3/protocol-specification-topic.html
+++ b/1.3/protocol-specification-topic.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-specification.html b/1.3/protocol-specification.html
index 4b50cfd..0903b63 100644
--- a/1.3/protocol-specification.html
+++ b/1.3/protocol-specification.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/protocol-twinlive.html b/1.3/protocol-twinlive.html
index 6e73ac7..5a76bcf 100644
--- a/1.3/protocol-twinlive.html
+++ b/1.3/protocol-twinlive.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_010-M1.html b/1.3/release_notes_010-M1.html
index a1e645b..18c3c34 100644
--- a/1.3/release_notes_010-M1.html
+++ b/1.3/release_notes_010-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_010-M3.html b/1.3/release_notes_010-M3.html
index d79d3db..49cd521 100644
--- a/1.3/release_notes_010-M3.html
+++ b/1.3/release_notes_010-M3.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_020-M1.html b/1.3/release_notes_020-M1.html
index 72827f0..c8be38f 100644
--- a/1.3/release_notes_020-M1.html
+++ b/1.3/release_notes_020-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_030-M1.html b/1.3/release_notes_030-M1.html
index cab4451..6d6e700 100644
--- a/1.3/release_notes_030-M1.html
+++ b/1.3/release_notes_030-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_030-M2.html b/1.3/release_notes_030-M2.html
index 587e60c..1bb59d0 100644
--- a/1.3/release_notes_030-M2.html
+++ b/1.3/release_notes_030-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_080-M1.html b/1.3/release_notes_080-M1.html
index ae254af..5281b85 100644
--- a/1.3/release_notes_080-M1.html
+++ b/1.3/release_notes_080-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_080-M2.html b/1.3/release_notes_080-M2.html
index ad8dda4..0fc8780 100644
--- a/1.3/release_notes_080-M2.html
+++ b/1.3/release_notes_080-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_080-M3.html b/1.3/release_notes_080-M3.html
index d6d9186..af56019 100644
--- a/1.3/release_notes_080-M3.html
+++ b/1.3/release_notes_080-M3.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_080.html b/1.3/release_notes_080.html
index cf810f8..d7b5e64 100644
--- a/1.3/release_notes_080.html
+++ b/1.3/release_notes_080.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_090-M1.html b/1.3/release_notes_090-M1.html
index 95bde75..3a8f972 100644
--- a/1.3/release_notes_090-M1.html
+++ b/1.3/release_notes_090-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_090-M2.html b/1.3/release_notes_090-M2.html
index c1baf50..4bd6264 100644
--- a/1.3/release_notes_090-M2.html
+++ b/1.3/release_notes_090-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_090.html b/1.3/release_notes_090.html
index 4848593..5edc2b4 100644
--- a/1.3/release_notes_090.html
+++ b/1.3/release_notes_090.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_100-M1a.html b/1.3/release_notes_100-M1a.html
index f78e921..efe4f20 100644
--- a/1.3/release_notes_100-M1a.html
+++ b/1.3/release_notes_100-M1a.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_100-M2.html b/1.3/release_notes_100-M2.html
index 52b960e..e758526 100644
--- a/1.3/release_notes_100-M2.html
+++ b/1.3/release_notes_100-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_100.html b/1.3/release_notes_100.html
index b62cbfb..8990de9 100644
--- a/1.3/release_notes_100.html
+++ b/1.3/release_notes_100.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_110.html b/1.3/release_notes_110.html
index e137d91..5cdfaa1 100644
--- a/1.3/release_notes_110.html
+++ b/1.3/release_notes_110.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_111.html b/1.3/release_notes_111.html
index d196b21..1a284aa 100644
--- a/1.3/release_notes_111.html
+++ b/1.3/release_notes_111.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_112.html b/1.3/release_notes_112.html
index 48aa46b..3c9ea66 100644
--- a/1.3/release_notes_112.html
+++ b/1.3/release_notes_112.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_113.html b/1.3/release_notes_113.html
index 27d40e1..d5927be 100644
--- a/1.3/release_notes_113.html
+++ b/1.3/release_notes_113.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_115.html b/1.3/release_notes_115.html
index 2fac8bc..a8cdbdb 100644
--- a/1.3/release_notes_115.html
+++ b/1.3/release_notes_115.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_120.html b/1.3/release_notes_120.html
index dee3ea8..c3147b3 100644
--- a/1.3/release_notes_120.html
+++ b/1.3/release_notes_120.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_121.html b/1.3/release_notes_121.html
index 7875108..59f2d19 100644
--- a/1.3/release_notes_121.html
+++ b/1.3/release_notes_121.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/release_notes_130.html b/1.3/release_notes_130.html
index d5255bb..4f6daec 100644
--- a/1.3/release_notes_130.html
+++ b/1.3/release_notes_130.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/sandbox.html b/1.3/sandbox.html
index 9b0d490..d9c63f2 100644
--- a/1.3/sandbox.html
+++ b/1.3/sandbox.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_architecture.html b/1.3/tag_architecture.html
index f4f9891..78cabe2 100644
--- a/1.3/tag_architecture.html
+++ b/1.3/tag_architecture.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_blog.html b/1.3/tag_blog.html
index 3c58273..3ef4173 100644
--- a/1.3/tag_blog.html
+++ b/1.3/tag_blog.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_client_sdk.html b/1.3/tag_client_sdk.html
index 0747b0c..303c6da 100644
--- a/1.3/tag_client_sdk.html
+++ b/1.3/tag_client_sdk.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_connectivity.html b/1.3/tag_connectivity.html
index 65bb0b2..abdb59c 100644
--- a/1.3/tag_connectivity.html
+++ b/1.3/tag_connectivity.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_getting_started.html b/1.3/tag_getting_started.html
index 4ac7a4d..e7a7b41 100644
--- a/1.3/tag_getting_started.html
+++ b/1.3/tag_getting_started.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_http.html b/1.3/tag_http.html
index 2c79443..e0390e1 100644
--- a/1.3/tag_http.html
+++ b/1.3/tag_http.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_installation.html b/1.3/tag_installation.html
index 9b6adeb..e2d8710 100644
--- a/1.3/tag_installation.html
+++ b/1.3/tag_installation.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_model.html b/1.3/tag_model.html
index cf32e38..dfeb43b 100644
--- a/1.3/tag_model.html
+++ b/1.3/tag_model.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_news.html b/1.3/tag_news.html
index 0eccd48..deec48f 100644
--- a/1.3/tag_news.html
+++ b/1.3/tag_news.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_protocol.html b/1.3/tag_protocol.html
index 4898270..b7c4978 100644
--- a/1.3/tag_protocol.html
+++ b/1.3/tag_protocol.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_release_notes.html b/1.3/tag_release_notes.html
index da6c890..affee4c 100644
--- a/1.3/tag_release_notes.html
+++ b/1.3/tag_release_notes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_rql.html b/1.3/tag_rql.html
index 61e03f7..e717aed 100644
--- a/1.3/tag_rql.html
+++ b/1.3/tag_rql.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_search.html b/1.3/tag_search.html
index b86b022..1f16949 100644
--- a/1.3/tag_search.html
+++ b/1.3/tag_search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_signal.html b/1.3/tag_signal.html
index 9927210..53f9d61 100644
--- a/1.3/tag_signal.html
+++ b/1.3/tag_signal.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.3/tag_troubleshooting.html b/1.3/tag_troubleshooting.html
index c8998f3..c439163 100644
--- a/1.3/tag_troubleshooting.html
+++ b/1.3/tag_troubleshooting.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1449,48 +1451,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/404.html b/1.4/404.html
index 4851857..b14766f 100644
--- a/1.4/404.html
+++ b/1.4/404.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-overview.html b/1.4/architecture-overview.html
index 50696e3..d00dcfe 100644
--- a/1.4/architecture-overview.html
+++ b/1.4/architecture-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-concierge.html b/1.4/architecture-services-concierge.html
index 3fb9c4b..4b9403f 100644
--- a/1.4/architecture-services-concierge.html
+++ b/1.4/architecture-services-concierge.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-connectivity.html b/1.4/architecture-services-connectivity.html
index 38dbe6a..726a2a4 100644
--- a/1.4/architecture-services-connectivity.html
+++ b/1.4/architecture-services-connectivity.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-gateway.html b/1.4/architecture-services-gateway.html
index c33454f..dcfa4ce 100644
--- a/1.4/architecture-services-gateway.html
+++ b/1.4/architecture-services-gateway.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-policies.html b/1.4/architecture-services-policies.html
index 77763b0..43f426b 100644
--- a/1.4/architecture-services-policies.html
+++ b/1.4/architecture-services-policies.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-things-search.html b/1.4/architecture-services-things-search.html
index 12f8e84..f173791 100644
--- a/1.4/architecture-services-things-search.html
+++ b/1.4/architecture-services-things-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/architecture-services-things.html b/1.4/architecture-services-things.html
index 939866f..8a29852 100644
--- a/1.4/architecture-services-things.html
+++ b/1.4/architecture-services-things.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-acknowledgements.html b/1.4/basic-acknowledgements.html
index 4039fb2..f5ece40 100644
--- a/1.4/basic-acknowledgements.html
+++ b/1.4/basic-acknowledgements.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-acl.html b/1.4/basic-acl.html
index 7fe7b5f..cc92a47 100644
--- a/1.4/basic-acl.html
+++ b/1.4/basic-acl.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-apis.html b/1.4/basic-apis.html
index d0585f0..aa35aaf 100644
--- a/1.4/basic-apis.html
+++ b/1.4/basic-apis.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-auth.html b/1.4/basic-auth.html
index 898db1a..d513ddf 100644
--- a/1.4/basic-auth.html
+++ b/1.4/basic-auth.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-changenotifications.html b/1.4/basic-changenotifications.html
index 2078bec..253a1cd 100644
--- a/1.4/basic-changenotifications.html
+++ b/1.4/basic-changenotifications.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-connections.html b/1.4/basic-connections.html
index bfa626f..c718dcb 100644
--- a/1.4/basic-connections.html
+++ b/1.4/basic-connections.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-enrichment.html b/1.4/basic-enrichment.html
index 4e146e2..03f2922 100644
--- a/1.4/basic-enrichment.html
+++ b/1.4/basic-enrichment.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-errors.html b/1.4/basic-errors.html
index cb65f94..72a8cbd 100644
--- a/1.4/basic-errors.html
+++ b/1.4/basic-errors.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-feature.html b/1.4/basic-feature.html
index d6f5fc1..4c3c707 100644
--- a/1.4/basic-feature.html
+++ b/1.4/basic-feature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-messages.html b/1.4/basic-messages.html
index 92cbcdd..7c859fe 100644
--- a/1.4/basic-messages.html
+++ b/1.4/basic-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-metadata.html b/1.4/basic-metadata.html
index 171edb3..b7711ce 100644
--- a/1.4/basic-metadata.html
+++ b/1.4/basic-metadata.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-namespaces-and-names.html b/1.4/basic-namespaces-and-names.html
index 7a79c90..3673398 100644
--- a/1.4/basic-namespaces-and-names.html
+++ b/1.4/basic-namespaces-and-names.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-overview.html b/1.4/basic-overview.html
index 0638eb8..e73d808 100644
--- a/1.4/basic-overview.html
+++ b/1.4/basic-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-placeholders.html b/1.4/basic-placeholders.html
index 97c85ea..55008f3 100644
--- a/1.4/basic-placeholders.html
+++ b/1.4/basic-placeholders.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-policy.html b/1.4/basic-policy.html
index 2c01d1f..24c66c3 100644
--- a/1.4/basic-policy.html
+++ b/1.4/basic-policy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-rql.html b/1.4/basic-rql.html
index a329716..3a91bff 100644
--- a/1.4/basic-rql.html
+++ b/1.4/basic-rql.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-search.html b/1.4/basic-search.html
index 1c78a50..4ccba85 100644
--- a/1.4/basic-search.html
+++ b/1.4/basic-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-signals-command.html b/1.4/basic-signals-command.html
index abc09a3..a4946e2 100644
--- a/1.4/basic-signals-command.html
+++ b/1.4/basic-signals-command.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-signals-commandresponse.html b/1.4/basic-signals-commandresponse.html
index e7f5ab4..5754c47 100644
--- a/1.4/basic-signals-commandresponse.html
+++ b/1.4/basic-signals-commandresponse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-signals-errorresponse.html b/1.4/basic-signals-errorresponse.html
index 5cc6614..ee2ee76 100644
--- a/1.4/basic-signals-errorresponse.html
+++ b/1.4/basic-signals-errorresponse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-signals-event.html b/1.4/basic-signals-event.html
index ad6499c..9452d9c 100644
--- a/1.4/basic-signals-event.html
+++ b/1.4/basic-signals-event.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-signals.html b/1.4/basic-signals.html
index 5b61a69..f48bb3b 100644
--- a/1.4/basic-signals.html
+++ b/1.4/basic-signals.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/basic-thing.html b/1.4/basic-thing.html
index e7dcb4d..449242b 100644
--- a/1.4/basic-thing.html
+++ b/1.4/basic-thing.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/client-sdk-java.html b/1.4/client-sdk-java.html
index b8091c9..65dddcd 100644
--- a/1.4/client-sdk-java.html
+++ b/1.4/client-sdk-java.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/client-sdk-javascript.html b/1.4/client-sdk-javascript.html
index 6cf8a35..9cea264 100644
--- a/1.4/client-sdk-javascript.html
+++ b/1.4/client-sdk-javascript.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/client-sdk-overview.html b/1.4/client-sdk-overview.html
index d350cc8..09ca5af 100644
--- a/1.4/client-sdk-overview.html
+++ b/1.4/client-sdk-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-header-mapping.html b/1.4/connectivity-header-mapping.html
index bba2a41..a1be8aa 100644
--- a/1.4/connectivity-header-mapping.html
+++ b/1.4/connectivity-header-mapping.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-manage-connections.html b/1.4/connectivity-manage-connections.html
index cdbac8c..7ada8c3 100644
--- a/1.4/connectivity-manage-connections.html
+++ b/1.4/connectivity-manage-connections.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-mapping.html b/1.4/connectivity-mapping.html
index bde5752..d26c3a8 100644
--- a/1.4/connectivity-mapping.html
+++ b/1.4/connectivity-mapping.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-overview.html b/1.4/connectivity-overview.html
index 8ef9d84..a589dd7 100644
--- a/1.4/connectivity-overview.html
+++ b/1.4/connectivity-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-amqp091.html b/1.4/connectivity-protocol-bindings-amqp091.html
index 6e72a19..ecd380e 100644
--- a/1.4/connectivity-protocol-bindings-amqp091.html
+++ b/1.4/connectivity-protocol-bindings-amqp091.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-amqp10.html b/1.4/connectivity-protocol-bindings-amqp10.html
index edbac78..73da82a 100644
--- a/1.4/connectivity-protocol-bindings-amqp10.html
+++ b/1.4/connectivity-protocol-bindings-amqp10.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-http.html b/1.4/connectivity-protocol-bindings-http.html
index f9559f5..33db8ea 100644
--- a/1.4/connectivity-protocol-bindings-http.html
+++ b/1.4/connectivity-protocol-bindings-http.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-kafka2.html b/1.4/connectivity-protocol-bindings-kafka2.html
index 876a4da..4c1f2d5 100644
--- a/1.4/connectivity-protocol-bindings-kafka2.html
+++ b/1.4/connectivity-protocol-bindings-kafka2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-mqtt.html b/1.4/connectivity-protocol-bindings-mqtt.html
index dd0eb18..ee89c8b 100644
--- a/1.4/connectivity-protocol-bindings-mqtt.html
+++ b/1.4/connectivity-protocol-bindings-mqtt.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-protocol-bindings-mqtt5.html b/1.4/connectivity-protocol-bindings-mqtt5.html
index e1deca5..26e7048 100644
--- a/1.4/connectivity-protocol-bindings-mqtt5.html
+++ b/1.4/connectivity-protocol-bindings-mqtt5.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/connectivity-tls-certificates.html b/1.4/connectivity-tls-certificates.html
index b9d8a9b..71be4b5 100644
--- a/1.4/connectivity-tls-certificates.html
+++ b/1.4/connectivity-tls-certificates.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/feedback.html b/1.4/feedback.html
index 6279bc6..0604190 100644
--- a/1.4/feedback.html
+++ b/1.4/feedback.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/glossary.html b/1.4/glossary.html
index cfda5f8..64fbc4a 100644
--- a/1.4/glossary.html
+++ b/1.4/glossary.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-concepts.html b/1.4/httpapi-concepts.html
index 6db76fa..7d9e561 100644
--- a/1.4/httpapi-concepts.html
+++ b/1.4/httpapi-concepts.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-messages.html b/1.4/httpapi-messages.html
index 3964194..8ee9672 100644
--- a/1.4/httpapi-messages.html
+++ b/1.4/httpapi-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-overview.html b/1.4/httpapi-overview.html
index 7a4e340..66e4998 100644
--- a/1.4/httpapi-overview.html
+++ b/1.4/httpapi-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-protocol-bindings-websocket.html b/1.4/httpapi-protocol-bindings-websocket.html
index 024daaa..c66de7e 100644
--- a/1.4/httpapi-protocol-bindings-websocket.html
+++ b/1.4/httpapi-protocol-bindings-websocket.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-search.html b/1.4/httpapi-search.html
index 58b1d19..45e7248 100644
--- a/1.4/httpapi-search.html
+++ b/1.4/httpapi-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/httpapi-sse.html b/1.4/httpapi-sse.html
index d4c45a9..ddbdfbf 100644
--- a/1.4/httpapi-sse.html
+++ b/1.4/httpapi-sse.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/installation-building.html b/1.4/installation-building.html
index 3e7e986..c6e3ad0 100644
--- a/1.4/installation-building.html
+++ b/1.4/installation-building.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/installation-operating.html b/1.4/installation-operating.html
index 3f482aa..9d1a07c 100644
--- a/1.4/installation-operating.html
+++ b/1.4/installation-operating.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/installation-running.html b/1.4/installation-running.html
index ac9d94c..9fc31df 100644
--- a/1.4/installation-running.html
+++ b/1.4/installation-running.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/intro-digitaltwins.html b/1.4/intro-digitaltwins.html
index b171f7a..c2e691d 100644
--- a/1.4/intro-digitaltwins.html
+++ b/1.4/intro-digitaltwins.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/intro-hello-world.html b/1.4/intro-hello-world.html
index cbd25ba..f7fff8a 100644
--- a/1.4/intro-hello-world.html
+++ b/1.4/intro-hello-world.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/intro-overview.html b/1.4/intro-overview.html
index 990a862..5672920 100644
--- a/1.4/intro-overview.html
+++ b/1.4/intro-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/js/customscripts.js b/1.4/js/customscripts.js
index 96aff54..c45cdb9 100644
--- a/1.4/js/customscripts.js
+++ b/1.4/js/customscripts.js
@@ -34,4 +34,46 @@
         });
 
     });
+
+    $("#dev-warning").hide();
+    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
+    $("#docVersion").change(changeSelectedDocVersion);
 });
+
+function changeSelectedDocVersionDropdownSelection(element) {
+    var pathName = window.location.pathname;
+
+    var versionOptions = element.options;
+    for (var i = 0; i < versionOptions.length; i++) {
+        var versionValue = versionOptions[i].value;
+        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
+            $("#docVersion").val(versionValue).change();
+            return;
+        }
+    }
+    // fallback: dev with "empty" version value:
+    $("#docVersion").val("").change();
+    $("#dev-warning").show();
+}
+
+function changeSelectedDocVersion() {
+    var versionValue = $('#docVersion').val();
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
+    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
+    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
+    if (versionValue === "" && !versionMatch) {
+        // do nothing, we're already on the correct "dev" version
+    } else if (versionMatch && (versionValue === versionMatch[1])) {
+        // do nothing, we're already on the correct version
+    } else {
+        if (versionValue === "" && versionMatch) {
+            window.location.pathname = "ditto/" + versionMatch[2];
+        } else if (versionValue === "") {
+            window.location.pathname = "ditto/" + remainingPath;
+        } else if (versionMatch) {
+            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
+        } else {
+            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
+        }
+    }
+}
diff --git a/1.4/presentations.html b/1.4/presentations.html
index 2c31ea5..54a6594 100644
--- a/1.4/presentations.html
+++ b/1.4/presentations.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-bindings.html b/1.4/protocol-bindings.html
index d13de36..6f59819 100644
--- a/1.4/protocol-bindings.html
+++ b/1.4/protocol-bindings.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createattribute.html b/1.4/protocol-examples-createattribute.html
index f80f230..115fbf9 100644
--- a/1.4/protocol-examples-createattribute.html
+++ b/1.4/protocol-examples-createattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createattributes.html b/1.4/protocol-examples-createattributes.html
index 7c9f77b..383860a 100644
--- a/1.4/protocol-examples-createattributes.html
+++ b/1.4/protocol-examples-createattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createdefinition.html b/1.4/protocol-examples-createdefinition.html
index 3bd0f26..2723807 100644
--- a/1.4/protocol-examples-createdefinition.html
+++ b/1.4/protocol-examples-createdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createfeature.html b/1.4/protocol-examples-createfeature.html
index cd9e0b2..28f1ffb 100644
--- a/1.4/protocol-examples-createfeature.html
+++ b/1.4/protocol-examples-createfeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createfeatures.html b/1.4/protocol-examples-createfeatures.html
index 5b1a1d8..76e335a 100644
--- a/1.4/protocol-examples-createfeatures.html
+++ b/1.4/protocol-examples-createfeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createproperties.html b/1.4/protocol-examples-createproperties.html
index 4d9fe47..20668ac 100644
--- a/1.4/protocol-examples-createproperties.html
+++ b/1.4/protocol-examples-createproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createproperty.html b/1.4/protocol-examples-createproperty.html
index 200c765..17391fe 100644
--- a/1.4/protocol-examples-createproperty.html
+++ b/1.4/protocol-examples-createproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-creatething.html b/1.4/protocol-examples-creatething.html
index 8c3027a..c78c55d 100644
--- a/1.4/protocol-examples-creatething.html
+++ b/1.4/protocol-examples-creatething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-createthingdefinition.html b/1.4/protocol-examples-createthingdefinition.html
index a63f023..6d48617 100644
--- a/1.4/protocol-examples-createthingdefinition.html
+++ b/1.4/protocol-examples-createthingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deleteattribute.html b/1.4/protocol-examples-deleteattribute.html
index 9ee3548..59180f8 100644
--- a/1.4/protocol-examples-deleteattribute.html
+++ b/1.4/protocol-examples-deleteattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deleteattributes.html b/1.4/protocol-examples-deleteattributes.html
index b1053db..96a7626 100644
--- a/1.4/protocol-examples-deleteattributes.html
+++ b/1.4/protocol-examples-deleteattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deletedefinition.html b/1.4/protocol-examples-deletedefinition.html
index 92dc961..ef5299f 100644
--- a/1.4/protocol-examples-deletedefinition.html
+++ b/1.4/protocol-examples-deletedefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deletefeature.html b/1.4/protocol-examples-deletefeature.html
index 7f09ff3..56ff76d 100644
--- a/1.4/protocol-examples-deletefeature.html
+++ b/1.4/protocol-examples-deletefeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deletefeatures.html b/1.4/protocol-examples-deletefeatures.html
index c37b6b4..4864331 100644
--- a/1.4/protocol-examples-deletefeatures.html
+++ b/1.4/protocol-examples-deletefeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deleteproperties.html b/1.4/protocol-examples-deleteproperties.html
index 481d517..a805564 100644
--- a/1.4/protocol-examples-deleteproperties.html
+++ b/1.4/protocol-examples-deleteproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deleteproperty.html b/1.4/protocol-examples-deleteproperty.html
index 546726a..ac39ede 100644
--- a/1.4/protocol-examples-deleteproperty.html
+++ b/1.4/protocol-examples-deleteproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deletething.html b/1.4/protocol-examples-deletething.html
index f7c10fa..0882776 100644
--- a/1.4/protocol-examples-deletething.html
+++ b/1.4/protocol-examples-deletething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-deletethingdefinition.html b/1.4/protocol-examples-deletethingdefinition.html
index 137a915..e2a677a 100644
--- a/1.4/protocol-examples-deletethingdefinition.html
+++ b/1.4/protocol-examples-deletethingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-errorresponses.html b/1.4/protocol-examples-errorresponses.html
index 7b0b096..43f0c42 100644
--- a/1.4/protocol-examples-errorresponses.html
+++ b/1.4/protocol-examples-errorresponses.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyattribute.html b/1.4/protocol-examples-modifyattribute.html
index b484eec..6027d5e 100644
--- a/1.4/protocol-examples-modifyattribute.html
+++ b/1.4/protocol-examples-modifyattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyattributes.html b/1.4/protocol-examples-modifyattributes.html
index 62796a4..3c2eea9 100644
--- a/1.4/protocol-examples-modifyattributes.html
+++ b/1.4/protocol-examples-modifyattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifydefinition.html b/1.4/protocol-examples-modifydefinition.html
index f8c5873..6fdbb89 100644
--- a/1.4/protocol-examples-modifydefinition.html
+++ b/1.4/protocol-examples-modifydefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyfeature.html b/1.4/protocol-examples-modifyfeature.html
index 03790bd..025a4b9 100644
--- a/1.4/protocol-examples-modifyfeature.html
+++ b/1.4/protocol-examples-modifyfeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyfeatures.html b/1.4/protocol-examples-modifyfeatures.html
index 9d74f47..1ba55ff 100644
--- a/1.4/protocol-examples-modifyfeatures.html
+++ b/1.4/protocol-examples-modifyfeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifypolicyid.html b/1.4/protocol-examples-modifypolicyid.html
index 66afa27..3badeb8 100644
--- a/1.4/protocol-examples-modifypolicyid.html
+++ b/1.4/protocol-examples-modifypolicyid.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyproperties.html b/1.4/protocol-examples-modifyproperties.html
index 562cdbc..091feec 100644
--- a/1.4/protocol-examples-modifyproperties.html
+++ b/1.4/protocol-examples-modifyproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifyproperty.html b/1.4/protocol-examples-modifyproperty.html
index 959a9a9..0cee25b 100644
--- a/1.4/protocol-examples-modifyproperty.html
+++ b/1.4/protocol-examples-modifyproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifything.html b/1.4/protocol-examples-modifything.html
index fd60c62..e64be66 100644
--- a/1.4/protocol-examples-modifything.html
+++ b/1.4/protocol-examples-modifything.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-modifythingdefinition.html b/1.4/protocol-examples-modifythingdefinition.html
index eb03e03..88a9bb2 100644
--- a/1.4/protocol-examples-modifythingdefinition.html
+++ b/1.4/protocol-examples-modifythingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-createpolicy.html b/1.4/protocol-examples-policies-createpolicy.html
index 7340833..4d049f5 100644
--- a/1.4/protocol-examples-policies-createpolicy.html
+++ b/1.4/protocol-examples-policies-createpolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-createpolicyentry.html b/1.4/protocol-examples-policies-createpolicyentry.html
index a0ac9d5..8a86c83 100644
--- a/1.4/protocol-examples-policies-createpolicyentry.html
+++ b/1.4/protocol-examples-policies-createpolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-createresource.html b/1.4/protocol-examples-policies-createresource.html
index 52e1ea6..6bedacd 100644
--- a/1.4/protocol-examples-policies-createresource.html
+++ b/1.4/protocol-examples-policies-createresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-createsubject.html b/1.4/protocol-examples-policies-createsubject.html
index fe92076..d101722 100644
--- a/1.4/protocol-examples-policies-createsubject.html
+++ b/1.4/protocol-examples-policies-createsubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-deletepolicy.html b/1.4/protocol-examples-policies-deletepolicy.html
index f274074..397ec93 100644
--- a/1.4/protocol-examples-policies-deletepolicy.html
+++ b/1.4/protocol-examples-policies-deletepolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-deletepolicyentry.html b/1.4/protocol-examples-policies-deletepolicyentry.html
index 05be961..b51ab9d 100644
--- a/1.4/protocol-examples-policies-deletepolicyentry.html
+++ b/1.4/protocol-examples-policies-deletepolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-deleteresource.html b/1.4/protocol-examples-policies-deleteresource.html
index fa58c8c..38f7fd2 100644
--- a/1.4/protocol-examples-policies-deleteresource.html
+++ b/1.4/protocol-examples-policies-deleteresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-deletesubject.html b/1.4/protocol-examples-policies-deletesubject.html
index 2b291c7..23565a9 100644
--- a/1.4/protocol-examples-policies-deletesubject.html
+++ b/1.4/protocol-examples-policies-deletesubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-errorresponses.html b/1.4/protocol-examples-policies-errorresponses.html
index b64a25e..ec8cbe6 100644
--- a/1.4/protocol-examples-policies-errorresponses.html
+++ b/1.4/protocol-examples-policies-errorresponses.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifypolicy.html b/1.4/protocol-examples-policies-modifypolicy.html
index 417b99a..2dad6fd 100644
--- a/1.4/protocol-examples-policies-modifypolicy.html
+++ b/1.4/protocol-examples-policies-modifypolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifypolicyentries.html b/1.4/protocol-examples-policies-modifypolicyentries.html
index e76fad5..09c1b61 100644
--- a/1.4/protocol-examples-policies-modifypolicyentries.html
+++ b/1.4/protocol-examples-policies-modifypolicyentries.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifypolicyentry.html b/1.4/protocol-examples-policies-modifypolicyentry.html
index c810672..5b21831 100644
--- a/1.4/protocol-examples-policies-modifypolicyentry.html
+++ b/1.4/protocol-examples-policies-modifypolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifyresource.html b/1.4/protocol-examples-policies-modifyresource.html
index 83c6134..48b2a89 100644
--- a/1.4/protocol-examples-policies-modifyresource.html
+++ b/1.4/protocol-examples-policies-modifyresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifyresources.html b/1.4/protocol-examples-policies-modifyresources.html
index d5bfdb5..770a148 100644
--- a/1.4/protocol-examples-policies-modifyresources.html
+++ b/1.4/protocol-examples-policies-modifyresources.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifysubject.html b/1.4/protocol-examples-policies-modifysubject.html
index 983f963..e19efc1 100644
--- a/1.4/protocol-examples-policies-modifysubject.html
+++ b/1.4/protocol-examples-policies-modifysubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-modifysubjects.html b/1.4/protocol-examples-policies-modifysubjects.html
index f4b590e..3d8f520 100644
--- a/1.4/protocol-examples-policies-modifysubjects.html
+++ b/1.4/protocol-examples-policies-modifysubjects.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrievepolicy.html b/1.4/protocol-examples-policies-retrievepolicy.html
index 22df9c6..7188a80 100644
--- a/1.4/protocol-examples-policies-retrievepolicy.html
+++ b/1.4/protocol-examples-policies-retrievepolicy.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrievepolicyentries.html b/1.4/protocol-examples-policies-retrievepolicyentries.html
index dbc3ce5..b56b624 100644
--- a/1.4/protocol-examples-policies-retrievepolicyentries.html
+++ b/1.4/protocol-examples-policies-retrievepolicyentries.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrievepolicyentry.html b/1.4/protocol-examples-policies-retrievepolicyentry.html
index 14daa37..ba23bee 100644
--- a/1.4/protocol-examples-policies-retrievepolicyentry.html
+++ b/1.4/protocol-examples-policies-retrievepolicyentry.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrieveresource.html b/1.4/protocol-examples-policies-retrieveresource.html
index b26ddf0..37d9da4 100644
--- a/1.4/protocol-examples-policies-retrieveresource.html
+++ b/1.4/protocol-examples-policies-retrieveresource.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrieveresources.html b/1.4/protocol-examples-policies-retrieveresources.html
index 91f3022..3e34080 100644
--- a/1.4/protocol-examples-policies-retrieveresources.html
+++ b/1.4/protocol-examples-policies-retrieveresources.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrievesubject.html b/1.4/protocol-examples-policies-retrievesubject.html
index 13f84db..573e407 100644
--- a/1.4/protocol-examples-policies-retrievesubject.html
+++ b/1.4/protocol-examples-policies-retrievesubject.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-policies-retrievesubjects.html b/1.4/protocol-examples-policies-retrievesubjects.html
index bbc9657..500d8f3 100644
--- a/1.4/protocol-examples-policies-retrievesubjects.html
+++ b/1.4/protocol-examples-policies-retrievesubjects.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrieveattribute.html b/1.4/protocol-examples-retrieveattribute.html
index d0b63f9..4f2c227 100644
--- a/1.4/protocol-examples-retrieveattribute.html
+++ b/1.4/protocol-examples-retrieveattribute.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrieveattributes.html b/1.4/protocol-examples-retrieveattributes.html
index 626b5cc..09549dd 100644
--- a/1.4/protocol-examples-retrieveattributes.html
+++ b/1.4/protocol-examples-retrieveattributes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievedefinition.html b/1.4/protocol-examples-retrievedefinition.html
index ecea697..e28cc0a 100644
--- a/1.4/protocol-examples-retrievedefinition.html
+++ b/1.4/protocol-examples-retrievedefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievefeature.html b/1.4/protocol-examples-retrievefeature.html
index bbf2e3c..4a3fe3e 100644
--- a/1.4/protocol-examples-retrievefeature.html
+++ b/1.4/protocol-examples-retrievefeature.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievefeatures.html b/1.4/protocol-examples-retrievefeatures.html
index f26705b..4aa2414 100644
--- a/1.4/protocol-examples-retrievefeatures.html
+++ b/1.4/protocol-examples-retrievefeatures.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrieveproperties.html b/1.4/protocol-examples-retrieveproperties.html
index 13460ce..9b1e320 100644
--- a/1.4/protocol-examples-retrieveproperties.html
+++ b/1.4/protocol-examples-retrieveproperties.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrieveproperty.html b/1.4/protocol-examples-retrieveproperty.html
index f4c07e3..94af9e9 100644
--- a/1.4/protocol-examples-retrieveproperty.html
+++ b/1.4/protocol-examples-retrieveproperty.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievething.html b/1.4/protocol-examples-retrievething.html
index 759b110..c6865d6 100644
--- a/1.4/protocol-examples-retrievething.html
+++ b/1.4/protocol-examples-retrievething.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievethingdefinition.html b/1.4/protocol-examples-retrievethingdefinition.html
index fe5fd12..811764b 100644
--- a/1.4/protocol-examples-retrievethingdefinition.html
+++ b/1.4/protocol-examples-retrievethingdefinition.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-retrievethings.html b/1.4/protocol-examples-retrievethings.html
index c5b9087..be45df0 100644
--- a/1.4/protocol-examples-retrievethings.html
+++ b/1.4/protocol-examples-retrievethings.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples-search.html b/1.4/protocol-examples-search.html
index b0c474d..bc8389c 100644
--- a/1.4/protocol-examples-search.html
+++ b/1.4/protocol-examples-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-examples.html b/1.4/protocol-examples.html
index ca74223..d3e7230 100644
--- a/1.4/protocol-examples.html
+++ b/1.4/protocol-examples.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-overview.html b/1.4/protocol-overview.html
index 71b6128..8ca8265 100644
--- a/1.4/protocol-overview.html
+++ b/1.4/protocol-overview.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-acks.html b/1.4/protocol-specification-acks.html
index 0691a08..858b6ee 100644
--- a/1.4/protocol-specification-acks.html
+++ b/1.4/protocol-specification-acks.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-errors.html b/1.4/protocol-specification-errors.html
index 8e91a93..1d32bf5 100644
--- a/1.4/protocol-specification-errors.html
+++ b/1.4/protocol-specification-errors.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-policies-create-or-modify.html b/1.4/protocol-specification-policies-create-or-modify.html
index 9f6b1e3..2033469 100644
--- a/1.4/protocol-specification-policies-create-or-modify.html
+++ b/1.4/protocol-specification-policies-create-or-modify.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-policies-delete.html b/1.4/protocol-specification-policies-delete.html
index c0c3314..7b49acd 100644
--- a/1.4/protocol-specification-policies-delete.html
+++ b/1.4/protocol-specification-policies-delete.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-policies-retrieve.html b/1.4/protocol-specification-policies-retrieve.html
index db95ea6..4c419cb 100644
--- a/1.4/protocol-specification-policies-retrieve.html
+++ b/1.4/protocol-specification-policies-retrieve.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-policies.html b/1.4/protocol-specification-policies.html
index ffae2d3..0fa7cbd 100644
--- a/1.4/protocol-specification-policies.html
+++ b/1.4/protocol-specification-policies.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things-create-or-modify.html b/1.4/protocol-specification-things-create-or-modify.html
index 6fe4ab6..be4e348 100644
--- a/1.4/protocol-specification-things-create-or-modify.html
+++ b/1.4/protocol-specification-things-create-or-modify.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things-delete.html b/1.4/protocol-specification-things-delete.html
index e00966e..e6605f3 100644
--- a/1.4/protocol-specification-things-delete.html
+++ b/1.4/protocol-specification-things-delete.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things-messages.html b/1.4/protocol-specification-things-messages.html
index 43f9448..1da0994 100644
--- a/1.4/protocol-specification-things-messages.html
+++ b/1.4/protocol-specification-things-messages.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things-retrieve.html b/1.4/protocol-specification-things-retrieve.html
index a9b2256..a47c822 100644
--- a/1.4/protocol-specification-things-retrieve.html
+++ b/1.4/protocol-specification-things-retrieve.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things-search.html b/1.4/protocol-specification-things-search.html
index 16e14e1..61a905f 100644
--- a/1.4/protocol-specification-things-search.html
+++ b/1.4/protocol-specification-things-search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-things.html b/1.4/protocol-specification-things.html
index 9d52fbe..ebb167a 100644
--- a/1.4/protocol-specification-things.html
+++ b/1.4/protocol-specification-things.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification-topic.html b/1.4/protocol-specification-topic.html
index e75de8a..5f696fd 100644
--- a/1.4/protocol-specification-topic.html
+++ b/1.4/protocol-specification-topic.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-specification.html b/1.4/protocol-specification.html
index c8ea82c..996000b 100644
--- a/1.4/protocol-specification.html
+++ b/1.4/protocol-specification.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/protocol-twinlive.html b/1.4/protocol-twinlive.html
index fd2a1d2..c8ad05e 100644
--- a/1.4/protocol-twinlive.html
+++ b/1.4/protocol-twinlive.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_010-M1.html b/1.4/release_notes_010-M1.html
index 6d8d153..a9fd8f2 100644
--- a/1.4/release_notes_010-M1.html
+++ b/1.4/release_notes_010-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_010-M3.html b/1.4/release_notes_010-M3.html
index cfe6f12..d5fd0a9 100644
--- a/1.4/release_notes_010-M3.html
+++ b/1.4/release_notes_010-M3.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_020-M1.html b/1.4/release_notes_020-M1.html
index 3b3cedb..ffc732f 100644
--- a/1.4/release_notes_020-M1.html
+++ b/1.4/release_notes_020-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_030-M1.html b/1.4/release_notes_030-M1.html
index 4c90f93..d2abe91 100644
--- a/1.4/release_notes_030-M1.html
+++ b/1.4/release_notes_030-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_030-M2.html b/1.4/release_notes_030-M2.html
index c647668..790e299 100644
--- a/1.4/release_notes_030-M2.html
+++ b/1.4/release_notes_030-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_080-M1.html b/1.4/release_notes_080-M1.html
index a759b1d..13ee526 100644
--- a/1.4/release_notes_080-M1.html
+++ b/1.4/release_notes_080-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_080-M2.html b/1.4/release_notes_080-M2.html
index 2a1571b..e6e0ea6 100644
--- a/1.4/release_notes_080-M2.html
+++ b/1.4/release_notes_080-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_080-M3.html b/1.4/release_notes_080-M3.html
index 6def8da..7f9ca18 100644
--- a/1.4/release_notes_080-M3.html
+++ b/1.4/release_notes_080-M3.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_080.html b/1.4/release_notes_080.html
index 28f9f0f..55dbd20 100644
--- a/1.4/release_notes_080.html
+++ b/1.4/release_notes_080.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_090-M1.html b/1.4/release_notes_090-M1.html
index a366123..bde222f 100644
--- a/1.4/release_notes_090-M1.html
+++ b/1.4/release_notes_090-M1.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_090-M2.html b/1.4/release_notes_090-M2.html
index 1669d6a..aac0c0f 100644
--- a/1.4/release_notes_090-M2.html
+++ b/1.4/release_notes_090-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_090.html b/1.4/release_notes_090.html
index 4b29a11..259052b 100644
--- a/1.4/release_notes_090.html
+++ b/1.4/release_notes_090.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_100-M1a.html b/1.4/release_notes_100-M1a.html
index 300a84e..1d67722 100644
--- a/1.4/release_notes_100-M1a.html
+++ b/1.4/release_notes_100-M1a.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_100-M2.html b/1.4/release_notes_100-M2.html
index 6ecd0fb..3517239 100644
--- a/1.4/release_notes_100-M2.html
+++ b/1.4/release_notes_100-M2.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_100.html b/1.4/release_notes_100.html
index ab337d1..bb25efe 100644
--- a/1.4/release_notes_100.html
+++ b/1.4/release_notes_100.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_110.html b/1.4/release_notes_110.html
index c7c2f76..00e0731 100644
--- a/1.4/release_notes_110.html
+++ b/1.4/release_notes_110.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_111.html b/1.4/release_notes_111.html
index 21ea3bf..846e6d1 100644
--- a/1.4/release_notes_111.html
+++ b/1.4/release_notes_111.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_112.html b/1.4/release_notes_112.html
index cd7839e..4636789 100644
--- a/1.4/release_notes_112.html
+++ b/1.4/release_notes_112.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_113.html b/1.4/release_notes_113.html
index 05129a7..15c74ac 100644
--- a/1.4/release_notes_113.html
+++ b/1.4/release_notes_113.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_115.html b/1.4/release_notes_115.html
index c7dbd5d..9ebcd34 100644
--- a/1.4/release_notes_115.html
+++ b/1.4/release_notes_115.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_120.html b/1.4/release_notes_120.html
index 94413b3..7d05473 100644
--- a/1.4/release_notes_120.html
+++ b/1.4/release_notes_120.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_121.html b/1.4/release_notes_121.html
index a495332..80f327f 100644
--- a/1.4/release_notes_121.html
+++ b/1.4/release_notes_121.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_130.html b/1.4/release_notes_130.html
index d024f00..1c0decf 100644
--- a/1.4/release_notes_130.html
+++ b/1.4/release_notes_130.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/release_notes_140.html b/1.4/release_notes_140.html
index e50961a..229723b 100644
--- a/1.4/release_notes_140.html
+++ b/1.4/release_notes_140.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/sandbox.html b/1.4/sandbox.html
index 23fb413..235651d 100644
--- a/1.4/sandbox.html
+++ b/1.4/sandbox.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_architecture.html b/1.4/tag_architecture.html
index af81ae9..925c3d9 100644
--- a/1.4/tag_architecture.html
+++ b/1.4/tag_architecture.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_blog.html b/1.4/tag_blog.html
index 5bc4e39..a2ac9ae 100644
--- a/1.4/tag_blog.html
+++ b/1.4/tag_blog.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_client_sdk.html b/1.4/tag_client_sdk.html
index e7a688e..41bce77 100644
--- a/1.4/tag_client_sdk.html
+++ b/1.4/tag_client_sdk.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_connectivity.html b/1.4/tag_connectivity.html
index 6b6df8c..f53cb41 100644
--- a/1.4/tag_connectivity.html
+++ b/1.4/tag_connectivity.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_getting_started.html b/1.4/tag_getting_started.html
index e5a4d54..63bbaa9 100644
--- a/1.4/tag_getting_started.html
+++ b/1.4/tag_getting_started.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_http.html b/1.4/tag_http.html
index ac72bd9..45b3762 100644
--- a/1.4/tag_http.html
+++ b/1.4/tag_http.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_installation.html b/1.4/tag_installation.html
index 9aa9be9..198272b 100644
--- a/1.4/tag_installation.html
+++ b/1.4/tag_installation.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_model.html b/1.4/tag_model.html
index dc4269c..b063c15 100644
--- a/1.4/tag_model.html
+++ b/1.4/tag_model.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_news.html b/1.4/tag_news.html
index 558dee8..7818d5f 100644
--- a/1.4/tag_news.html
+++ b/1.4/tag_news.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_protocol.html b/1.4/tag_protocol.html
index 608171b..0c9ee6e 100644
--- a/1.4/tag_protocol.html
+++ b/1.4/tag_protocol.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_release_notes.html b/1.4/tag_release_notes.html
index a791127..5ed4ded 100644
--- a/1.4/tag_release_notes.html
+++ b/1.4/tag_release_notes.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_rql.html b/1.4/tag_rql.html
index 325c6f7..a440e27 100644
--- a/1.4/tag_rql.html
+++ b/1.4/tag_rql.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_search.html b/1.4/tag_search.html
index 134f773..44ac7cc 100644
--- a/1.4/tag_search.html
+++ b/1.4/tag_search.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_signal.html b/1.4/tag_signal.html
index ee4f5ab..f13210d 100644
--- a/1.4/tag_signal.html
+++ b/1.4/tag_signal.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/1.4/tag_troubleshooting.html b/1.4/tag_troubleshooting.html
index b0ef344..21b4203 100644
--- a/1.4/tag_troubleshooting.html
+++ b/1.4/tag_troubleshooting.html
@@ -208,6 +208,8 @@
         
         <option value="1.3">1.3</option>
         
+        <option value="1.4">1.4</option>
+        
       </select>
     </div>
     <div id="dev-warning">
@@ -1456,48 +1458,6 @@
 
 <!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
 <script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
 </script>
 
             </div>
diff --git a/feed.xml b/feed.xml
index 14f149d..0931e18 100644
--- a/feed.xml
+++ b/feed.xml
@@ -5,8 +5,8 @@
         <description>Announcements, tutorials and examples around Eclipse Ditto and Digital Twins</description>
         <link>https://www.eclipse.org/ditto/</link>
         <atom:link href="https://www.eclipse.org/ditto/feed.xml" rel="self" type="application/rss+xml"/>
-        <pubDate>Mon, 02 Nov 2020 13:14:33 +0000</pubDate>
-        <lastBuildDate>Mon, 02 Nov 2020 13:14:33 +0000</lastBuildDate>
+        <pubDate>Mon, 02 Nov 2020 14:03:27 +0000</pubDate>
+        <lastBuildDate>Mon, 02 Nov 2020 14:03:27 +0000</lastBuildDate>
         <generator>Jekyll v3.6.2</generator>
         
         <item>
diff --git a/httpapi-postman.html b/httpapi-postman.html
deleted file mode 100644
index 0bc80f5..0000000
--- a/httpapi-postman.html
+++ /dev/null
@@ -1,1315 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<meta name="description" content="">
-<meta name="keywords" content="http,  api, http, REST, postman, explore">
-<title>  HTTP API Run in Postman • Eclipse Ditto • a digital twin framework</title>
-
-<link rel="stylesheet" href="css/syntax.css">
-<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">
-<link rel="stylesheet" href="css/modern-business.css">
-<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" crossorigin="anonymous">
-<link rel="stylesheet" href="css/customstyles.css">
-<link rel="stylesheet" href="css/boxshadowproperties.css">
-<link rel="stylesheet" href="css/theme-ditto.css">
-<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700">
-
-<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js" crossorigin="anonymous"></script>
-<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script>
-<script src="//cdnjs.cloudflare.com/ajax/libs/anchor-js/2.0.0/anchor.min.js" crossorigin="anonymous"></script>
-<script src="js/toc.js"></script>
-<script src="js/customscripts.js"></script>
-
-<script type="application/ld+json">
-{
-  "@context": "http://schema.org",
-  "@type": "Organization",
-  "url": "https://eclipse.org/ditto/",
-  "logo": "https://eclipse.org/ditto/images/ditto.svg"
-}
-</script>
-
-<link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16">
-<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32">
-<link rel="icon" type="image/png" href="images/favicon-96x96.png" sizes="96x96">
-
-<link rel="alternate" type="application/rss+xml" title="Eclipse Ditto Blog" href="https://www.eclipse.org/ditto/feed.xml">
-
-<!-- Eclipse Foundation cookie consent: -->
-<link rel="stylesheet" type="text/css" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css" />
-<script src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script>
-
-    <script>
-        $(document).ready(function() {
-            $("#tg-sb-link").click(function() {
-                $("#tg-sb-sidebar").toggle();
-                $("#tg-sb-content").toggleClass('col-md-9');
-                $("#tg-sb-content").toggleClass('col-md-12');
-                $("#tg-sb-icon").toggleClass('fa-toggle-on');
-                $("#tg-sb-icon").toggleClass('fa-toggle-off');
-            });
-        });
-    </script>
-</head>
-
-
-<script>
-    (function(w,d,s,l,i){
-        w[l]=w[l]||[];
-        w[l].push({'gtm.start':
-            new Date().getTime(),event:'gtm.js'});
-        var f=d.getElementsByTagName(s)[0],
-            j=d.createElement(s),
-            dl=l!='dataLayer'?'&l='+l:'';
-        j.async=true;
-        j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
-        f.parentNode.insertBefore(j,f);
-    })(window,document,'script','dataLayer','GTM-5WLCZXC');
-</script>
-
-
-
-<body>
-<!-- Navigation -->
-<nav class="navbar navbar-inverse navbar-fixed-top">
-    <div class="container topnavlinks">
-        <div class="navbar-header">
-            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
-                <span class="sr-only">Toggle navigation</span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-            </button>
-            <a class="navbar-ditto-home" href="index.html">&nbsp;<img src="images/ditto_allwhite_symbolonly.svg" class="ditto-navbar-symbol" alt="Home"> <img src="images/ditto_allwhite_textonly.svg" class="ditto-navbar-symbol-text" alt="Ditto"></a>
-        </div>
-        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
-            <ul class="nav navbar-nav navbar-right">
-                <!-- toggle sidebar button -->
-                <!--<li><a id="tg-sb-link" href="#"><i id="tg-sb-icon" class="fa fa-toggle-on"></i> Nav</a></li>-->
-                <!-- entries without drop-downs appear here -->
-
-
-
-
-                
-                
-                
-                <li><a href="blog.html">Blog</a></li>
-                
-                
-                
-                <li><a href="intro-overview.html">Documentation</a></li>
-                
-                
-                
-                <li><a href="http-api-doc.html">HTTP API</a></li>
-                
-                
-                
-                <li><a href="https://ditto.eclipse.org" target="_blank">Sandbox</a></li>
-                
-                
-                
-                <li><a href="https://github.com/eclipse/ditto" target="_blank">GitHub</a></li>
-                
-                
-                
-                <li><a href="https://github.com/eclipse/ditto-examples" target="_blank">GitHub examples</a></li>
-                
-                
-                
-                <!-- entries with drop-downs appear here -->
-                <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
-                
-                
-                <li class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Links<b class="caret"></b></a>
-                    <ul class="dropdown-menu">
-                        
-                        
-                        <li><a href="https://projects.eclipse.org/projects/iot.ditto" target="_blank">Eclipse Ditto Project</a></li>
-                        
-                        
-                        
-                        <li><a href="https://www.eclipse.org/forums/index.php/f/364/" target="_blank">Forum</a></li>
-                        
-                        
-                        
-                        <li><a href="https://ci.eclipse.org/ditto/" target="_blank">Jenkins</a></li>
-                        
-                        
-                        
-                        <li><a href="https://dev.eclipse.org/mhonarc/lists/ditto-dev/" target="_blank">Mailing list archives</a></li>
-                        
-                        
-                        
-                        <li><a href="https://gitter.im/eclipse/ditto" target="_blank">Gitter.im chat</a></li>
-                        
-                        
-                    </ul>
-                </li>
-                
-                
-                
-                <!--comment out this block if you want to hide search-->
-                <li>
-                    <!--start search-->
-                    <div id="search-demo-container">
-                        <input type="text" id="search-input" placeholder="search...">
-                        <ul id="results-container"></ul>
-                    </div>
-                    <script src="//cdnjs.cloudflare.com/ajax/libs/simple-jekyll-search/0.0.9/jekyll-search.js" type="text/javascript"></script>
-                    <script type="text/javascript">
-                            SimpleJekyllSearch.init({
-                                searchInput: document.getElementById('search-input'),
-                                resultsContainer: document.getElementById('results-container'),
-                                dataSource: 'search.json',
-                                searchResultTemplate: '<li><a href="{url}" title="HTTP API Run in Postman">{title}</a></li>',
-                                noResultsText: 'No results found.',
-                                limit: 10,
-                                fuzzy: true,
-                    })
-                    </script>
-                    <!--end search-->
-                </li>
-            </ul>
-        </div>
-    </div>
-    <!-- /.container -->
-</nav>
-
-<!-- Page Content -->
-<div class="container">
-  <div id="main">
-    <!-- Content Row -->
-    <div class="row">
-        
-        
-            <!-- Sidebar Column -->
-            <div class="col-md-3" id="tg-sb-sidebar">
-                
-
-<ul id="mysidebar" class="nav">
-  <li class="sidebarTitle">
-    <label for="docVersion">Eclipse Ditto  version:</label>
-    <select id="docVersion" name="docVersion">
-      
-      <option value="">development</option>
-      
-      <option value="1.0">1.0</option>
-      
-    </select>
-    <div id="dev-warning">
-      <div markdown="span" class="alert alert-warning" role="alert" style="font-size:0.6em"><i class="fa fa-warning"></i> <b>Important:</b> This documentation reflects the latest 'development'. You might want to choose a released version.</div>
-    </div>
-  </li>
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Introduction</a>
-          <ul>
-              
-              
-              
-              <li><a href="intro-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="intro-digitaltwins.html">Digital twins</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="intro-hello-world.html">Hello world</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Release Notes</a>
-          <ul>
-              
-              
-              
-              <li><a href="release_notes_100.html">1.0.0</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="release_notes_090.html">0.9.0</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="release_notes_080.html">0.8.0</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Milestone releases</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="release_notes_100-M2.html">1.0.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_100-M1a.html">1.0.0-M1a</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_090-M2.html">0.9.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_090-M1.html">0.9.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M3.html">0.8.0-M3</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M2.html">0.8.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_080-M1.html">0.8.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_030-M2.html">0.3.0-M2</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_030-M1.html">0.3.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_020-M1.html">0.2.0-M1</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_010-M3.html">0.1.0-M3</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="release_notes_010-M1.html">0.1.0-M1</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Installation</a>
-          <ul>
-              
-              
-              
-              <li><a href="installation-building.html">Building Ditto</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="installation-running.html">Running Ditto</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="installation-operating.html">Operating Ditto</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Basic concepts</a>
-          <ul>
-              
-              
-              
-              <li><a href="basic-overview.html">Overview</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Model entities</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="basic-thing.html">Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-acl.html">Access Control List (ACL)</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-feature.html">Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-policy.html">Policy</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-namespaces-and-names.html">Namespaces and Names</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-auth.html">Authentication and Authorization</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-messages.html">Messages</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-signals.html">Signals</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Signal types</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="basic-signals-command.html">Command</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-commandresponse.html">Command response</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-errorresponse.html">Error response</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="basic-signals-event.html">Event</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-apis.html">APIs</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-connections.html">Connections</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-placeholders.html">Placeholders</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-changenotifications.html">Change notifications</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-rql.html">RQL expressions</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="basic-search.html">Search</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Architecture</a>
-          <ul>
-              
-              
-              
-              <li><a href="architecture-overview.html">Overview</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>Services</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="architecture-services-policies.html">Policies</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-things.html">Things</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-things-search.html">Things-Search</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-connectivity.html">Connectivity</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-concierge.html">Concierge</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="architecture-services-gateway.html">Gateway</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>HTTP API</a>
-          <ul>
-              
-              
-              
-              <li><a href="httpapi-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-concepts.html">Concepts</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-search.html">Search</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-messages.html">Messages</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-protocol-bindings-websocket.html">WebSocket protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="httpapi-sse.html">Server sent events</a></li>
-              
-              
-              
-              
-              
-              
-              <li class="active"><a href="httpapi-postman.html">Run in Postman</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Connectivity API</a>
-          <ul>
-              
-              
-              
-              <li><a href="connectivity-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-manage-connections.html">Manage connections</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-amqp091.html">AMQP 0.9.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-amqp10.html">AMQP 1.0 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-mqtt.html">MQTT 3.1.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-http.html">HTTP 1.1 protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-protocol-bindings-kafka2.html">Kafka 2.x protocol binding</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-mapping.html">Payload mapping</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-header-mapping.html">Header mapping</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="connectivity-tls-certificates.html">TLS certificates</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Client SDK</a>
-          <ul>
-              
-              
-              
-              <li><a href="client-sdk-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="client-sdk-java.html">Java</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="client-sdk-javascript.html">JavaScript</a></li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-        <li class="subfolders">
-          <a href="#"><span></span>Ditto Protocol</a>
-          <ul>
-              
-              
-              
-              <li><a href="protocol-overview.html">Overview</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-twinlive.html">Twin/live channel</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification.html">Specification</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification-topic.html">Protocol topic</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-specification-things.html">Things group</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ commands/events</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-create-or-modify.html">Create/Modify</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-retrieve.html">Retrieve</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-delete.html">Delete</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ search/messages</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-search.html">Search</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-specification-things-messages.html">Messages</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-bindings.html">Bindings</a></li>
-              
-              
-              
-              
-              
-              
-              <li><a href="protocol-examples.html">Examples</a></li>
-              
-              
-              
-              <li class="subfolders">
-                  <a href="#"><span></span>→ Things examples</a>
-                  <ul>
-                      
-                      
-                      
-                      <li><a href="protocol-examples-creatething.html">Create a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletething.html">Delete a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifything.html">Modify a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievething.html">Retrieve a Thing</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievethings.html">Retrieve multiple Things</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createattributes.html">Create Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteattributes.html">Delete Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyattributes.html">Modify Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveattributes.html">Retrieve Attributes</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createattribute.html">Create a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteattribute.html">Delete a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyattribute.html">Modify a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveattribute.html">Retrieve a single Attribute</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createthingdefinition.html">Create a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletethingdefinition.html">Delete a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifythingdefinition.html">Modify a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievethingdefinition.html">Retrieve a Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createfeatures.html">Create Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletefeatures.html">Delete Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyfeatures.html">Modify Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievefeatures.html">Retrieve Features</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createfeature.html">Create a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletefeature.html">Delete a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyfeature.html">Modify a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievefeature.html">Retrieve a single Feature</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createdefinition.html">Create Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deletedefinition.html">Delete Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifydefinition.html">Modify Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrievedefinition.html">Retrieve Feature Definition</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createproperties.html">Create Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteproperties.html">Delete Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyproperties.html">Modify Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveproperties.html">Retrieve Feature Properties</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-createproperty.html">Create a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-deleteproperty.html">Delete a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-modifyproperty.html">Modify a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-retrieveproperty.html">Retrieve a single Property</a></li>
-                      
-                      
-                      
-                      
-                      
-                      <li><a href="protocol-examples-errorresponses.html">Error Responses</a></li>
-                      
-                      
-                      
-                  </ul>
-              </li>
-              
-              
-              
-              
-          </ul>
-        </li>
-    
-  
-  
-  
-    
-    <li><a href="sandbox.html">Sandbox</a></li>
-    
-  
-  
-  
-    
-    <li><a href="presentations.html">Presentations</a></li>
-    
-  
-  
-  
-    
-    <li><a href="glossary.html">Glossary</a></li>
-    
-  
-  
-  
-    
-    <li><a href="feedback.html">Feedback</a></li>
-    
-  
-  
-  
-    
-         <p class="external">
-             <a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a>
-         </p>
-    
-</ul>
-
-<!-- this highlights the active parent class in the sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
-<script>$("li.active").parents('li').toggleClass("active");
-
-$(function() {
-  $("#dev-warning").hide();
-  changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
-  $("#docVersion").change(changeSelectedDocVersion);
-});
-
-function changeSelectedDocVersionDropdownSelection(element) {
-  var pathName = window.location.pathname;
-
-  var versionOptions = element.options;
-  for (var i = 0; i < versionOptions.length; i++) {
-    var versionValue = versionOptions[i].value;
-    if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
-      $("#docVersion").val(versionValue).change();
-      return;
-    }
-  }
-  // fallback: dev with "empty" version value:
-  $("#docVersion").val("").change();
-  $("#dev-warning").show();
-}
-function changeSelectedDocVersion() {
-  var versionValue = $('#docVersion').val();
-  var remainingPath = window.location.pathname.replace("/ditto/", "");
-  var versionMatch = remainingPath.match("([0-9].[0.9])/(.*)");
-  if (versionValue === "" && !versionMatch) {
-    // do nothing, we're already on the correct "dev" version
-  } else if (versionMatch && (versionValue === versionMatch[1])) {
-    // do nothing, we're already on the correct version
-  } else {
-    if (versionValue === "" && versionMatch) {
-      window.location.pathname = "ditto/" + versionMatch[2];
-    } else if (versionValue === "") {
-      window.location.pathname = "ditto/" + remainingPath;
-    } else if (versionMatch) {
-      window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
-    } else {
-      window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
-    }
-  }
-}
-</script>
-
-            </div>
-            
-        
-
-        <!-- Content Column -->
-        <div class="col-md-9" id="tg-sb-content">
-            <div class="post-header">
-   <h1 class="post-title-main">HTTP API Run in Postman</h1>
-</div>
-
-
-
-<div class="post-content">
-
-   
-
-    
-    
-<!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
-<script>
-$( document ).ready(function() {
-  // Handler for .ready() called.
-
-$('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' });
-
-/* this offset helps account for the space taken up by the floating toolbar. */
-$('#toc').on('click', 'a', function() {
-  var target = $(this.getAttribute('href'))
-    , scroll_target = target.offset().top
-
-  $(window).scrollTop(scroll_target - 10);
-  return false
-})
-  
-});
-</script>
-
-<div id="toc"></div>
-
-    
-
-
-    
-
-
-    
-
-  <p>Use <a href="https://www.getpostman.com">Postman</a> and import the Ditto Postman collection which can be downloaded here:</p>
-<ul>
-  <li><a href="postman/Ditto.postman_collection.json">Ditto Postman collection</a></li>
-  <li><a href="postman/Ditto_Sandbox.postman_environment.json">Ditto Postman environment for sandbox</a></li>
-</ul>
-
-
-
-    <div class="tags">
-        
-        <b>Tags: </b>
-        
-        
-        
-        <a href="tag_http.html" class="btn btn-default navbar-btn cursorNorm" role="button">http</a>
-        
-        
-        
-    </div>
-
-</div>
-
-<hr class="shaded"/>
-
-<footer>
-            <div class="row">
-                <div class="col-lg-12 footer">
-                    <div class="logo">
-                        <a href="https://eclipse.org"><img src="images/eclipse_foundation_logo.svg" alt="Eclipse logo"/></a>
-                    </div>
-                    <p class="notice">
-                        &copy;2020 Eclipse Ditto.
-                         Site last generated: Jan 31, 2020 <br />
-                    </p>
-                    <div class="quickLinks">
-                        <a href="https://www.eclipse.org/legal/privacy.php" target="_blank">
-                            &gt; Privacy Policy
-                        </a>
-                        <a href="https://www.eclipse.org/legal/termsofuse.php" target="_blank">
-                            &gt; Terms of Use
-                        </a>
-                        <a href="https://www.eclipse.org/legal/copyright.php" target="_blank">
-                            &gt; Copyright Agent
-                        </a>
-                        <a href="https://www.eclipse.org/legal" target="_blank">
-                            &gt; Legal
-                        </a>
-                        <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">
-                            &gt; License
-                        </a>
-                        <a href="https://eclipse.org/security" target="_blank">
-                            &gt; Report a Vulnerability
-                        </a>
-                    </div>
-                </div>
-            </div>
-</footer>
-
-
-        </div>
-    <!-- /.row -->
-</div>
-<!-- /.container -->
-</div>
-<!-- /#main -->
-    </div>
-
-</body>
-</html>
diff --git a/js/customscripts.js b/js/customscripts.js
index a7fdddd..c45cdb9 100644
--- a/js/customscripts.js
+++ b/js/customscripts.js
@@ -58,7 +58,7 @@
 
 function changeSelectedDocVersion() {
     var versionValue = $('#docVersion').val();
-    var remainingPath = window.location.pathname.replace("/ditto", "/");
+    var remainingPath = window.location.pathname.replace("/ditto/", "/");
     remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
     var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
     if (versionValue === "" && !versionMatch) {
