diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a2e865d8da9b3ad5e6563ea6015e14fdbd91252a
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,170 @@
+
+
+build-docker-common:
+  image: docker:18
+  script:
+    - echo "nameserver 172.26.4.20" > /etc/resolv.conf
+    - export http_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - export https_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
+    - docker pull $CI_REGISTRY_IMAGE:common || true
+    - >
+      docker build -f Dockerfile_common
+      --pull
+      --build-arg http_proxy=$http_proxy
+      --build-arg https_proxy=$http_proxy
+      --build-arg VCS_REF=$CI_COMMIT_SHA
+      --build-arg VCS_URL=$CI_PROJECT_URL
+      --build-arg SOURCE=$QUALNET_9301_SOURCE
+      --build-arg EXTRA_LIBS=$QUALNET_9301_LIBS_U1804
+      --cache-from $CI_REGISTRY_IMAGE:common
+      --tag $CI_REGISTRY_IMAGE:common
+      .
+    - docker push $CI_REGISTRY_IMAGE:common
+
+build-docker-filtering:
+  image: docker:18
+  needs: ["build-docker-common"]
+  script:
+    - echo "nameserver 172.26.4.20" > /etc/resolv.conf
+    - export http_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - export https_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
+    - docker pull $CI_REGISTRY_IMAGE:filtering || true
+    - >
+      docker build -f Dockerfile_filtering
+      --pull
+      --build-arg http_proxy=$http_proxy
+      --build-arg https_proxy=$http_proxy
+      --build-arg VCS_REF=$CI_COMMIT_SHA
+      --build-arg VCS_URL=$CI_PROJECT_URL
+      --build-arg BASE_IMG=$CI_REGISTRY_IMAGE
+      --cache-from $CI_REGISTRY_IMAGE:filtering
+      --tag $CI_REGISTRY_IMAGE:filtering
+      .
+    - docker push $CI_REGISTRY_IMAGE:filtering
+
+build-docker-original-iwcmc:
+  image: docker:18
+  needs: ["build-docker-common"]
+  script:
+    - echo "nameserver 172.26.4.20" > /etc/resolv.conf
+    - export http_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - export https_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
+    - docker pull $CI_REGISTRY_IMAGE:original_iwcmc || true
+    - >
+      docker build -f Dockerfile_original_iwcmc
+      --pull
+      --build-arg http_proxy=$http_proxy
+      --build-arg https_proxy=$http_proxy
+      --build-arg VCS_REF=$CI_COMMIT_SHA
+      --build-arg VCS_URL=$CI_PROJECT_URL
+      --build-arg BASE_IMG=$CI_REGISTRY_IMAGE
+      --cache-from $CI_REGISTRY_IMAGE:original_iwcmc
+      --tag $CI_REGISTRY_IMAGE:original_iwcmc
+      .
+    - docker push $CI_REGISTRY_IMAGE:original_iwcmc
+
+build-docker-original:
+  image: docker:18
+  script:
+    - echo "nameserver 172.26.4.20" > /etc/resolv.conf
+    - export http_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - export https_proxy="http://proxy-serveur.univ-nantes.prive:3128"
+    - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
+    - docker pull $CI_REGISTRY_IMAGE:original || true
+    - >
+      docker build -f Dockerfile_original
+      --pull
+      --build-arg http_proxy=$http_proxy
+      --build-arg https_proxy=$http_proxy
+      --build-arg VCS_REF=$CI_COMMIT_SHA
+      --build-arg VCS_URL=$CI_PROJECT_URL
+      --build-arg SOURCE=$QUALNET_921_SOURCE
+      --build-arg EXTRA_LIBS=$QUALNET_921_LIBS_U1804
+      --cache-from $CI_REGISTRY_IMAGE:original
+      --tag $CI_REGISTRY_IMAGE:original
+      .
+    - docker push $CI_REGISTRY_IMAGE:original
+
+qualnet-iwcmc-filtering:
+  image: $CI_REGISTRY_IMAGE:filtering
+  needs: ["build-docker-filtering"]
+  timeout: 4h
+  cache:
+      key: qualnet-9-3-0-1-filtering
+      paths:
+        - /data/qualnet-9.3.0.1/build/
+  script:
+    - source /etc/profile.d/eureka.sh
+    - use_eureka
+    - cd ~/qualnet-9.3.0.1/build
+    - cmake .
+    - make exata
+    - ldd bin/qualnet | cut -d ">" -f2 | cut -d ' ' -f2 | grep ".so" | xargs -d "\n" cp -f -u -t ./bin/
+  artifacts:
+    paths:
+      - "/data/qualnet-9.3.0.1/build/bin/*"
+
+qualnet-iwcmc-original:
+  image: $CI_REGISTRY_IMAGE:original_iwcmc
+  needs: ["build-docker-original-iwcmc"]
+  timeout: 4h
+  cache:
+      key: qualnet-9-3-0-1-original-iwcmc
+      paths:
+        - /data/qualnet-9.3.0.1/build/
+  script:
+    - source /etc/profile.d/eureka.sh
+    - use_eureka
+    - cd ~/qualnet-9.3.0.1/build
+    - cmake .
+    - make exata
+    - ldd bin/qualnet | cut -d ">" -f2 | cut -d ' ' -f2 | grep ".so" | xargs -d "\n" cp -f -u -t ./bin/
+  artifacts:
+    paths:
+      - "/data/qualnet-9.3.0.1/build/bin/*"
+
+qualnet-adhocnet-original:
+  image: $CI_REGISTRY_IMAGE:original
+  needs: ["build-docker-original"]
+  timeout: 4h
+  cache:
+      key: qualnet-9-2-1-original
+      paths:
+        - /data/qualnet-9.3.0.1/build/
+  script:
+    - cp -r ADHOCNET_2020/Original/libraries/user_models/src ~/qualnet-9.2.1/libraries/user_models/src
+    - cp patch_qualnet_8.2_to_9.2.patch ~/qualnet-9.2.1/
+    - cd ~/qualnet-9.2.1/
+    - git apply patch_qualnet_8.2_to_9.2.patch
+    - cd build
+    - cmake .
+    - make exata
+    - ldd bin/qualnet | cut -d ">" -f2 | cut -d ' ' -f2 | grep ".so" | xargs -d "\n" cp -f -u -t ./bin/
+  artifacts:
+    paths:
+      - "/data/qualnet-9.2.1/build/bin/*"
+
+qualnet-adhocnet-epoch:
+  image: $CI_REGISTRY_IMAGE:original
+  needs: ["build-docker-original"]
+  timeout: 4h
+  cache:
+      key: qualnet-9-2-1-original
+      paths:
+        - /data/qualnet-9.3.0.1/build/
+  script:
+    - cp -r ADHOCNET_2020/Epoch/libraries/user_models/src ~/qualnet-9.2.1/libraries/user_models/src
+    - cp patch_qualnet_8.2_to_9.2.patch ~/qualnet-9.2.1/
+    - cd ~/qualnet-9.2.1/
+    - git apply patch_qualnet_8.2_to_9.2.patch
+    - cd build
+    - cmake .
+    - make exata
+    - ldd bin/qualnet | cut -d ">" -f2 | cut -d ' ' -f2 | grep ".so" | xargs -d "\n" cp -f -u -t ./bin/
+  artifacts:
+    paths:
+      - "/data/qualnet-9.2.1/build/bin/*"
+
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/CMakeLists.txt b/ADHOCNET_2020/Epoch/libraries/user_models/CMakeLists.txt
similarity index 93%
rename from ADHOCNET 2020/Epoch/libraries/user_models/CMakeLists.txt
rename to ADHOCNET_2020/Epoch/libraries/user_models/CMakeLists.txt
index c0b9e390cfd00f621feccef0559b2999ad958a05..706adb5e1af729b240b74cdedcc7075f722c8879 100644
--- a/ADHOCNET 2020/Epoch/libraries/user_models/CMakeLists.txt	
+++ b/ADHOCNET_2020/Epoch/libraries/user_models/CMakeLists.txt
@@ -1,6 +1,7 @@
 option(WITH_USER_MODELS "Build the User Models library" ON)
 if (WITH_USER_MODELS)
 	add_global_definitions(-DUSER_MODELS_LIB)
+	add_global_definitions(-DQROUTING)
 	add_global_include_dir(src)
 	add_srcs(
 	src/routing_qrouting.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/aux_data_extractor.cpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/aux_data_extractor.cpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/aux_data_extractor.cpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/aux_data_extractor.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/aux_data_extractor.hpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/aux_data_extractor.hpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/aux_data_extractor.hpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/aux_data_extractor.hpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/confLoader.cpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/confLoader.cpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/confLoader.cpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/confLoader.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/confLoader.h b/ADHOCNET_2020/Epoch/libraries/user_models/src/confLoader.h
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/confLoader.h
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/confLoader.h
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_route.cpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_route.cpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_route.cpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_route.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_route.hpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_route.hpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_route.hpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_route.hpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_table.cpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_table.cpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_table.cpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_table.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_table.hpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_table.hpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/qrouting_table.hpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/qrouting_table.hpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/routing_qrouting.cpp b/ADHOCNET_2020/Epoch/libraries/user_models/src/routing_qrouting.cpp
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/routing_qrouting.cpp
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/routing_qrouting.cpp
diff --git a/ADHOCNET 2020/Epoch/libraries/user_models/src/routing_qrouting.h b/ADHOCNET_2020/Epoch/libraries/user_models/src/routing_qrouting.h
similarity index 100%
rename from ADHOCNET 2020/Epoch/libraries/user_models/src/routing_qrouting.h
rename to ADHOCNET_2020/Epoch/libraries/user_models/src/routing_qrouting.h
diff --git a/ADHOCNET 2020/Original/libraries/user_models/CMakeLists.txt b/ADHOCNET_2020/Original/libraries/user_models/CMakeLists.txt
similarity index 93%
rename from ADHOCNET 2020/Original/libraries/user_models/CMakeLists.txt
rename to ADHOCNET_2020/Original/libraries/user_models/CMakeLists.txt
index c0b9e390cfd00f621feccef0559b2999ad958a05..706adb5e1af729b240b74cdedcc7075f722c8879 100644
--- a/ADHOCNET 2020/Original/libraries/user_models/CMakeLists.txt	
+++ b/ADHOCNET_2020/Original/libraries/user_models/CMakeLists.txt
@@ -1,6 +1,7 @@
 option(WITH_USER_MODELS "Build the User Models library" ON)
 if (WITH_USER_MODELS)
 	add_global_definitions(-DUSER_MODELS_LIB)
+	add_global_definitions(-DQROUTING)
 	add_global_include_dir(src)
 	add_srcs(
 	src/routing_qrouting.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/aux_data_extractor.cpp b/ADHOCNET_2020/Original/libraries/user_models/src/aux_data_extractor.cpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/aux_data_extractor.cpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/aux_data_extractor.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/aux_data_extractor.hpp b/ADHOCNET_2020/Original/libraries/user_models/src/aux_data_extractor.hpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/aux_data_extractor.hpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/aux_data_extractor.hpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/confLoader.cpp b/ADHOCNET_2020/Original/libraries/user_models/src/confLoader.cpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/confLoader.cpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/confLoader.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/confLoader.h b/ADHOCNET_2020/Original/libraries/user_models/src/confLoader.h
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/confLoader.h
rename to ADHOCNET_2020/Original/libraries/user_models/src/confLoader.h
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/qrouting_route.cpp b/ADHOCNET_2020/Original/libraries/user_models/src/qrouting_route.cpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/qrouting_route.cpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/qrouting_route.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/qrouting_route.hpp b/ADHOCNET_2020/Original/libraries/user_models/src/qrouting_route.hpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/qrouting_route.hpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/qrouting_route.hpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/qrouting_table.cpp b/ADHOCNET_2020/Original/libraries/user_models/src/qrouting_table.cpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/qrouting_table.cpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/qrouting_table.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/qrouting_table.hpp b/ADHOCNET_2020/Original/libraries/user_models/src/qrouting_table.hpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/qrouting_table.hpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/qrouting_table.hpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/routing_qrouting.cpp b/ADHOCNET_2020/Original/libraries/user_models/src/routing_qrouting.cpp
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/routing_qrouting.cpp
rename to ADHOCNET_2020/Original/libraries/user_models/src/routing_qrouting.cpp
diff --git a/ADHOCNET 2020/Original/libraries/user_models/src/routing_qrouting.h b/ADHOCNET_2020/Original/libraries/user_models/src/routing_qrouting.h
similarity index 100%
rename from ADHOCNET 2020/Original/libraries/user_models/src/routing_qrouting.h
rename to ADHOCNET_2020/Original/libraries/user_models/src/routing_qrouting.h
diff --git a/ADHOCNET 2020/README.md b/ADHOCNET_2020/README.md
similarity index 100%
rename from ADHOCNET 2020/README.md
rename to ADHOCNET_2020/README.md
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/README.md b/ADHOCNET_2020/Scenario/wireless_grid_2/README.md
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/README.md
rename to ADHOCNET_2020/Scenario/wireless_grid_2/README.md
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/log.conf b/ADHOCNET_2020/Scenario/wireless_grid_2/log.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/log.conf
rename to ADHOCNET_2020/Scenario/wireless_grid_2/log.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/qrouting.conf b/ADHOCNET_2020/Scenario/wireless_grid_2/qrouting.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/qrouting.conf
rename to ADHOCNET_2020/Scenario/wireless_grid_2/qrouting.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/test.json b/ADHOCNET_2020/Scenario/wireless_grid_2/test.json
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/test.json
rename to ADHOCNET_2020/Scenario/wireless_grid_2/test.json
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.app b/ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.app
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.app
rename to ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.app
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.config b/ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.config
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.config
rename to ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.config
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.display b/ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.display
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.display
rename to ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.display
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.nodes b/ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.nodes
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_2/wireless_grid_2.nodes
rename to ADHOCNET_2020/Scenario/wireless_grid_2/wireless_grid_2.nodes
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/README.md b/ADHOCNET_2020/Scenario/wireless_grid_3/README.md
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/README.md
rename to ADHOCNET_2020/Scenario/wireless_grid_3/README.md
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/log.conf b/ADHOCNET_2020/Scenario/wireless_grid_3/log.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/log.conf
rename to ADHOCNET_2020/Scenario/wireless_grid_3/log.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/qrouting.conf b/ADHOCNET_2020/Scenario/wireless_grid_3/qrouting.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/qrouting.conf
rename to ADHOCNET_2020/Scenario/wireless_grid_3/qrouting.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/test.json b/ADHOCNET_2020/Scenario/wireless_grid_3/test.json
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/test.json
rename to ADHOCNET_2020/Scenario/wireless_grid_3/test.json
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.app b/ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.app
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.app
rename to ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.app
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.config b/ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.config
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.config
rename to ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.config
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.display b/ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.display
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.display
rename to ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.display
diff --git a/ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.nodes b/ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.nodes
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_grid_3/wireless_grid_3.nodes
rename to ADHOCNET_2020/Scenario/wireless_grid_3/wireless_grid_3.nodes
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/README.md b/ADHOCNET_2020/Scenario/wireless_toy/README.md
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/README.md
rename to ADHOCNET_2020/Scenario/wireless_toy/README.md
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/log.conf b/ADHOCNET_2020/Scenario/wireless_toy/log.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/log.conf
rename to ADHOCNET_2020/Scenario/wireless_toy/log.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/qrouting.conf b/ADHOCNET_2020/Scenario/wireless_toy/qrouting.conf
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/qrouting.conf
rename to ADHOCNET_2020/Scenario/wireless_toy/qrouting.conf
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/test.json b/ADHOCNET_2020/Scenario/wireless_toy/test.json
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/test.json
rename to ADHOCNET_2020/Scenario/wireless_toy/test.json
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.app b/ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.app
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.app
rename to ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.app
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.config b/ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.config
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.config
rename to ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.config
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.display b/ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.display
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.display
rename to ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.display
diff --git a/ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.nodes b/ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.nodes
similarity index 100%
rename from ADHOCNET 2020/Scenario/wireless_toy/wireless_toy.nodes
rename to ADHOCNET_2020/Scenario/wireless_toy/wireless_toy.nodes
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6f772a6e8fcde504a00acb75161faa2b140a288..84220f23700917ff059532c33684d71101b48b6e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
+22/05/2022:
+* Add Gitlab CI.
+
 22/11/2021:
-* Add Q-routing with filtering and scenarios (IWCMC 2021)
+* Add Q-routing with filtering and scenarios (IWCMC 2021).
 * Add extra scenario from phd. thesis.
 
 03/03/2021:
@@ -18,4 +21,4 @@
 * Add/restore license header and license file.
 * Correct the reward (aux_q.cpp).
 * Add this changelog.
-* Add Readme.
\ No newline at end of file
+* Add Readme.
diff --git a/Dockerfile_common b/Dockerfile_common
new file mode 100644
index 0000000000000000000000000000000000000000..fd243c2d415ab0fe21f84c8b588eaea271381088
--- /dev/null
+++ b/Dockerfile_common
@@ -0,0 +1,14 @@
+FROM ubuntu:bionic
+ENV DEBIAN_FRONTEND noninteractive
+ARG EXTRA_LIBS
+ARG SOURCE
+
+RUN sed -i -e "s/archive.ubuntu.com/ubuntu.univ-nantes.fr/g" /etc/apt/sources.list && sed -i -e "s/security.ubuntu.com/ubuntu.univ-nantes.fr/g" /etc/apt/sources.list
+RUN apt-get update -q && apt-get install git ca-certificates libssl-dev libpcap-dev libzmq3-dev libzmqpp-dev --no-install-recommends -qy && git clone $EXTRA_LIBS && echo "deb [trusted=yes] file:///$(pwd)/qualnet-9.3.0.1-extra-ubuntu18/eureka-pkgs unstable main" >> /etc/apt/sources.list && apt-get update -q && apt-get install eureka-qualnet-deps -qy && rm -r qualnet-9.3.0.1-extra-ubuntu18 && apt-get clean
+
+ENV HOME /data
+WORKDIR /data
+RUN git clone $SOURCE --depth 1 -b main
+COPY patch_integration_qualnet_9.3.patch ./qualnet-9.3.0.1/
+RUN cd qualnet-9.3.0.1 && git apply patch_integration_qualnet_9.3.patch && . /etc/profile.d/eureka.sh && use_eureka && cmake -S ./ -B build -DCMAKE_BUILD_TYPE=Release
+VOLUME ["/data"]
diff --git a/Dockerfile_filtering b/Dockerfile_filtering
new file mode 100644
index 0000000000000000000000000000000000000000..c517fa8cdd887fc3830bf58042261178d5430fa8
--- /dev/null
+++ b/Dockerfile_filtering
@@ -0,0 +1,3 @@
+ARG BASE_IMG
+FROM $BASE_IMG:common
+ADD IWCMC_2021/Q-routing_filtering/libraries/user_models ./qualnet-9.3.0.1/libraries/user_models
diff --git a/Dockerfile_original b/Dockerfile_original
new file mode 100644
index 0000000000000000000000000000000000000000..6f6369cf3ec8e3d87c31a4fef9c742c0be33f7c1
--- /dev/null
+++ b/Dockerfile_original
@@ -0,0 +1,15 @@
+FROM ubuntu:bionic
+ENV DEBIAN_FRONTEND noninteractive
+ARG EXTRA_LIBS
+ARG SOURCE
+
+RUN apt-get update -q && apt-get install --no-install-recommends libexpat1 libexpat1-dev libssl1.0.0 libssl1.1 libssl-dev libsqlite3-0 libsqlite3-dev libpcap0.8 libpcap-dev libpcre32-3 libpcre3-dev libeigen3-dev libpthread-stubs0-dev libc6-dev libmariadb3 libmariadb-dev zlib1g-dev libgoogle-perftools4 libgoogle-perftools-dev gcc-7 g++-7 make unzip git file ca-certificates binutils pkg-config build-essential -qy && apt-get clean
+RUN git clone $EXTRA_LIBS && cd qualnet-9.2.1-extra-ubuntu18 && apt-get update -q && dpkg -i ./*.deb && apt-get -f install -yq && apt-get clean && unzip protobuf-cpp-3.10.0.zip && cd protobuf-3.10.0 && ./configure && make && make install && cd .. && unzip fmt-6.0.0.zip && cd fmt-6.0.0 && mkdir build && cmake -S ./ -B build && cd build && make && make install && cd .. && ldconfig && cd ../.. && rm -r qualnet-9.2.1-extra-ubuntu18
+
+ENV HOME /data
+WORKDIR /data
+RUN git clone $SOURCE --depth 1 -b master
+COPY patch_integration_qualnet_9.2.patch ./qualnet-9.2.1/
+RUN cd qualnet-9.2.1 && git apply patch_integration_qualnet_9.2.patch && cmake -S ./ -B build -DCMAKE_BUILD_TYPE=Release
+ADD ADHOCNET_2020/Original/libraries/user_models ./qualnet-9.2.1/libraries/user_models
+VOLUME ["/data"]
diff --git a/Dockerfile_original_iwcmc b/Dockerfile_original_iwcmc
new file mode 100644
index 0000000000000000000000000000000000000000..050b57fc6c348a17dce80deef7ce2f236c497a19
--- /dev/null
+++ b/Dockerfile_original_iwcmc
@@ -0,0 +1,3 @@
+ARG BASE_IMG
+FROM $BASE_IMG:common
+ADD IWCMC_2021/Original/libraries/user_models ./qualnet-9.3.0.1/libraries/user_models
diff --git a/IWCMC 2021/Original/libraries/user_models/CMakeLists.txt b/IWCMC 2021/Original/libraries/user_models/CMakeLists.txt
deleted file mode 100644
index c0b9e390cfd00f621feccef0559b2999ad958a05..0000000000000000000000000000000000000000
--- a/IWCMC 2021/Original/libraries/user_models/CMakeLists.txt	
+++ /dev/null
@@ -1,20 +0,0 @@
-option(WITH_USER_MODELS "Build the User Models library" ON)
-if (WITH_USER_MODELS)
-	add_global_definitions(-DUSER_MODELS_LIB)
-	add_global_include_dir(src)
-	add_srcs(
-	src/routing_qrouting.cpp
-	src/routing_qrouting.h
-	src/qrouting_route.cpp
-	src/qrouting_route.hpp
-	src/qrouting_table.cpp
-	src/qrouting_table.hpp
-	src/confLoader.h
-	src/confLoader.cpp
-	src/aux_data_extractor.hpp
-	src/aux_data_extractor.cpp
-	)
-	add_doxygen_inputs(src)
-endif()
-
-add_feature_info(user_models WITH_USER_MODELS "User Models library")
\ No newline at end of file
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/CMakeLists.txt b/IWCMC_2021/Original/libraries/user_models/CMakeLists.txt
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/CMakeLists.txt
rename to IWCMC_2021/Original/libraries/user_models/CMakeLists.txt
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/CMakeLists.txt b/IWCMC_2021/Original/libraries/user_models/conf_loader/CMakeLists.txt
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/CMakeLists.txt
rename to IWCMC_2021/Original/libraries/user_models/conf_loader/CMakeLists.txt
diff --git a/IWCMC 2021/Original/libraries/user_models/src/confLoader.cpp b/IWCMC_2021/Original/libraries/user_models/conf_loader/src/confLoader.cpp
similarity index 100%
rename from IWCMC 2021/Original/libraries/user_models/src/confLoader.cpp
rename to IWCMC_2021/Original/libraries/user_models/conf_loader/src/confLoader.cpp
diff --git a/IWCMC 2021/Original/libraries/user_models/src/confLoader.h b/IWCMC_2021/Original/libraries/user_models/conf_loader/src/confLoader.h
similarity index 100%
rename from IWCMC 2021/Original/libraries/user_models/src/confLoader.h
rename to IWCMC_2021/Original/libraries/user_models/conf_loader/src/confLoader.h
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/CMakeLists.txt b/IWCMC_2021/Original/libraries/user_models/data_extractor/CMakeLists.txt
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/CMakeLists.txt
rename to IWCMC_2021/Original/libraries/user_models/data_extractor/CMakeLists.txt
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/src/aux_data_extractor.cpp b/IWCMC_2021/Original/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
rename to IWCMC_2021/Original/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/src/aux_data_extractor.hpp b/IWCMC_2021/Original/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
rename to IWCMC_2021/Original/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/CMakeLists.txt b/IWCMC_2021/Original/libraries/user_models/qrouting/CMakeLists.txt
similarity index 91%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/CMakeLists.txt
rename to IWCMC_2021/Original/libraries/user_models/qrouting/CMakeLists.txt
index 798175a2135d59c092e09cf94c767e10c47eaae1..60e67ba90e0ccd129d1566d9f104d3c86b1b8358 100644
--- a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/CMakeLists.txt	
+++ b/IWCMC_2021/Original/libraries/user_models/qrouting/CMakeLists.txt
@@ -11,7 +11,6 @@ if (WITH_USER_MODELS)
 			src/qrouting_route.hpp
 			src/qrouting_table.cpp
 			src/qrouting_table.hpp
-			src/aux_linear_regression.hpp
 			)
 	endif()
 endif()
diff --git a/IWCMC 2021/Original/libraries/user_models/src/qrouting_route.cpp b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_route.cpp
similarity index 100%
rename from IWCMC 2021/Original/libraries/user_models/src/qrouting_route.cpp
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_route.cpp
diff --git a/IWCMC 2021/Original/libraries/user_models/src/qrouting_route.hpp b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_route.hpp
similarity index 100%
rename from IWCMC 2021/Original/libraries/user_models/src/qrouting_route.hpp
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_route.hpp
diff --git a/IWCMC 2021/Original/libraries/user_models/src/qrouting_table.cpp b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.cpp
similarity index 87%
rename from IWCMC 2021/Original/libraries/user_models/src/qrouting_table.cpp
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.cpp
index ac33a267e238629f4cb289956f22e95cd6ee8aeb..f0bc5c42028aa9b843fd44f2498994b80f6bef62 100644
--- a/IWCMC 2021/Original/libraries/user_models/src/qrouting_table.cpp	
+++ b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.cpp
@@ -74,7 +74,7 @@ namespace qrouting {
 				endExplorationPhase = std::stoi(conf.get_conf("explorationPhase")) * SECOND;
 			}
 			if (conf.get_conf("epsilon") != "") {
-				epsilon = std::stod(conf.get_conf("epsilon")) * SECOND;
+				epsilon = std::stod(conf.get_conf("epsilon"));
 			}
 			if (conf.get_conf("timeout") != "") {
 				timeout = std::stoi(conf.get_conf("timeout")) * SECOND;
@@ -239,6 +239,38 @@ namespace qrouting {
 		}
 	}
 
+	void QVect::printConfigurtion(void (*p1)(Node*, const char*, const char*, NodeAddress, int, const char*, ...), Node* node, const char* app, const char* proto, NodeAddress addr, int random) const
+	{
+#ifdef COGNET
+		p1(node, app, proto, addr, random, "Compilation = CogMod");
+#endif
+		char buffer[256];
+		if (epsilon > 0) {
+			p1(node, app, proto, addr, random, "Epsilon updates = enabled");
+			sprintf(buffer, "Epsilon value = %f", epsilon);
+			p1(node, app, proto, addr, random, buffer);
+		}
+		else {
+			p1(node, app, proto, addr, random, "Epsilon updates = disabled");
+		}
+			p1(node, app, proto, addr, random, "Epoch updates = disabled");
+			p1(node, app, proto, addr, random, "Linear regression = disabled");
+		sprintf(buffer, "Periodic updates rates (s) = %llu", periodicUpdateRate / SECOND);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Timeout (s) = %llu", timeout / SECOND);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Timeout check rate (s) = %llu", timeoutCheckRate / SECOND);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Exploration (s) = %llu", endExplorationPhase / SECOND);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Init reward = %f", defaultReward);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Max hop per route = %u", maxRouteLength);
+		p1(node, app, proto, addr, random, buffer);
+		sprintf(buffer, "Learning rate = %f", alpha);
+		p1(node, app, proto, addr, random, buffer);
+	}
+
 	void QVect::extractRoutes(std::mutex* lock_file, std::ofstream* log_file, const NodeAddress nodeId, const std::vector<Address> nodeAddr, const clocktype now) const {
 		std::lock_guard<std::mutex> guard(*lock_file);
 		unsigned int nows = now / SECOND;
diff --git a/IWCMC 2021/Original/libraries/user_models/src/qrouting_table.hpp b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.hpp
similarity index 94%
rename from IWCMC 2021/Original/libraries/user_models/src/qrouting_table.hpp
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.hpp
index 906113ac5274cbcc3bdec5a8fc389ecc79e439f2..827f38ff878204a715c2a630eb654f74a1ca4f52 100644
--- a/IWCMC 2021/Original/libraries/user_models/src/qrouting_table.hpp	
+++ b/IWCMC_2021/Original/libraries/user_models/qrouting/src/qrouting_table.hpp
@@ -36,6 +36,8 @@ knowledge of the CeCILL-C license and that you accept its terms.
 #pragma once
 #include "qrouting_route.hpp"
 #include <vector>
+#include <memory>
+#include <functional>
 
 namespace qrouting {
 #define USE_TIMEOUT_PENALITY
@@ -72,6 +74,9 @@ namespace qrouting {
 		int checkTimeout(Node* node, const clocktype& now);
 		void printQTable() const;
 		RandomSeed* getSeed() { return &randChoice; }
+		void printConfigurtion(void (*)(Node*, const char*, const char*, NodeAddress, int, const char*, ...), Node*, const char*, const char*, NodeAddress, int) const;
+
+		// Extract method
 		void extractRoutes(std::mutex* lock_file, std::ofstream* log_file, const NodeAddress nodeId, const std::vector<Address> nodeAddr, const clocktype now) const;
 		void extractQTable(std::mutex* lock_file, std::ofstream* log_file, const NodeAddress nodeId, const std::vector<Address> nodeAddr, const clocktype now) const;
 #ifdef USE_HASH
diff --git a/IWCMC 2021/Original/libraries/user_models/src/routing_qrouting.cpp b/IWCMC_2021/Original/libraries/user_models/qrouting/src/routing_qrouting.cpp
similarity index 97%
rename from IWCMC 2021/Original/libraries/user_models/src/routing_qrouting.cpp
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/routing_qrouting.cpp
index ce2950986360c7de852a67b937cc7b6d5843b007..41d497ec22275c7d057c449d2e26b7c3688fdfe0 100644
--- a/IWCMC 2021/Original/libraries/user_models/src/routing_qrouting.cpp	
+++ b/IWCMC_2021/Original/libraries/user_models/qrouting/src/routing_qrouting.cpp
@@ -26,9 +26,25 @@ As Qualnet uses events and messages, we reuse Bellman-Ford messages.
 #include "app_util.h"
 #include "routing_qrouting.h"
 #include "qrouting_table.hpp"
-#define EnableExtractor 1 // With the argument -np > 1, it requires full C++11 // So not VS C++ 2013 and under // GCC 4.9+ OK
+#ifdef ENABLE_EXTRACTOR // With the argument -np > 1, it requires full C++11 // So not VS C++ 2013 and under // GCC 4.9+ OK
 #include "aux_data_extractor.hpp"	// data extractor
 #include <future>
+#endif
+#ifdef COGNET
+enum {
+	MSG_COGNET_REFRESH
+};
+#endif
+
+void QroutingHookToRedistribute(
+	Node* node,
+	NodeAddress destAddress,
+	NodeAddress destAddressMask,
+	NodeAddress nextHopAddress,
+	int interfaceIndex,
+	void* routeCost,
+	unsigned short receiverAsId);
+
 namespace qrouting {
 //#define DEBUG_QTABLE
 #define nDEBUG
@@ -104,6 +120,13 @@ namespace qrouting {
 		RandomSeed checkTimeoutSeed;
 		RandomSeed triggeredUpdateSeed;
 		BOOL statsPrinted;
+		Qrouting() : triggeredUpdateScheduled(FALSE), statsPrinted(FALSE), numPeriodicUpdates(0)
+			, numTriggeredUpdates(0), numRouteAdvertisementsReceived(0), numRouteTimeouts(0), nextPeriodicUpdateTime(0)
+		{
+			periodicJitterSeed[0] = periodicJitterSeed[1] = periodicJitterSeed[2] = 0;
+			checkTimeoutSeed[0] = checkTimeoutSeed[1] = checkTimeoutSeed[2] = 0;
+			triggeredUpdateSeed[0] = triggeredUpdateSeed[1] = triggeredUpdateSeed[2] = 0;
+		}
 	};
 
 	//
@@ -140,18 +163,18 @@ namespace qrouting {
 		ROUTING_BELLMANFORD_POST_UPDATE
 	} PrintRouteTableType;
 
-#if EnableExtractor
+#ifdef ENABLE_EXTRACTOR
 	class QTableExtractor : public DataExtractor<QTableExtractor> {
 		friend class DataExtractor<QTableExtractor>;
 		QTableExtractor() : DataExtractor("QTable") {}
 	public:
-		virtual void extract(Node* node, boost::any callback = 0) {
+		virtual void extract(Node* node, any callback = 0) {
 			if (logFile.is_open()) {
 				std::vector<Address> nodeAddrs(node->numberInterfaces);
 				for (int i = 0; i < node->numberInterfaces; i++) {
 					NetworkGetInterfaceInfo(node, i, &nodeAddrs[i]);
 				}
-				boost::any_cast<void(*)(Node*, std::mutex*, std::ofstream*, NodeAddress, std::vector<Address>)>(callback)(node, &logLock, &logFile, node->nodeId, nodeAddrs);
+				any_cast<void(*)(Node*, std::mutex*, std::ofstream*, NodeAddress, std::vector<Address>)>(callback)(node, &logLock, &logFile, node->nodeId, nodeAddrs);
 			}
 		}
 	};
@@ -516,7 +539,7 @@ void RoutingQroutingInit(Node* node)
 		APP_ROUTING_QROUTING,
 		MSG_APP_CheckRouteTimeoutAlarm);
 	MESSAGE_Send(node, newMsg, qrouting->q.getTimeoutCheckInterval() + randomDelay);
-#if EnableExtractor
+#ifdef ENABLE_EXTRACTOR
 	DropExtractor::getInstance().scheduleLog(node, APP_ROUTING_QROUTING);
 #endif
 	// Dynamic address
@@ -592,7 +615,7 @@ void RoutingQroutingLayer(Node* node, Message* msg)
 		HandleFromTransport(node, msg);
 		break;
 	}
-#if EnableExtractor
+#ifdef ENABLE_EXTRACTOR
 	case MSG_LOGNOW:
 	{
 		AppExtractor::getInstance().extract(node);
@@ -638,7 +661,7 @@ void RoutingQroutingFinalize(Node* node, int interfaceIndex)
 {
 	using namespace qrouting;
 	Qrouting* qrouting = (Qrouting*)node->appData.qrouting;
-#if EnableExtractor
+#ifdef ENABLE_EXTRACTOR
 	RouteExtractor::getInstance().extract(node, RouteQroutingExtraction);
 #endif
 	if (node->get_networkData()->networkProtocol == NETWORK_IPV6)
@@ -1309,6 +1332,7 @@ namespace qrouting {
 		sprintf(buf, "Number of update packets received = %d",
 			qrouting->numRouteAdvertisementsReceived);
 		IO_PrintStat(node, "Application", "Qrouting", ANY_DEST, -1, buf);
+		qrouting->q.printConfigurtion(IO_PrintStat, node, "Application", "Qrouting", ANY_DEST, -1);
 	}
 
 	//-----------------------------------------------------------------------------
@@ -1445,7 +1469,8 @@ void QroutingHookToRedistribute(
 	NodeAddress destAddressMask,
 	NodeAddress nextHopAddress,
 	int interfaceIndex,
-	void* routeCost)
+	void* routeCost,
+	unsigned short receiverAsId)
 {
 	using namespace qrouting;
 	int cost = *(int*)routeCost;
diff --git a/IWCMC 2021/Original/libraries/user_models/src/routing_qrouting.h b/IWCMC_2021/Original/libraries/user_models/qrouting/src/routing_qrouting.h
similarity index 100%
rename from IWCMC 2021/Original/libraries/user_models/src/routing_qrouting.h
rename to IWCMC_2021/Original/libraries/user_models/qrouting/src/routing_qrouting.h
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/CMakeLists.txt b/IWCMC_2021/Q-routing_filtering/libraries/CMakeLists.txt
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/CMakeLists.txt
rename to IWCMC_2021/Q-routing_filtering/libraries/CMakeLists.txt
diff --git a/IWCMC_2021/Q-routing_filtering/libraries/user_models/CMakeLists.txt b/IWCMC_2021/Q-routing_filtering/libraries/user_models/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1faa26857875f3bb41b85733a91b2257c872f819
--- /dev/null
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/CMakeLists.txt
@@ -0,0 +1,14 @@
+option(WITH_USER_MODELS "Build the User Models library" ON)
+if (WITH_USER_MODELS)
+	add_global_definitions(-DUSER_MODELS_LIB)
+	foreach (optional_lib
+		conf_loader
+		data_extractor
+		qrouting)
+	  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${optional_lib})
+		add_subdirectory(${optional_lib})
+	  endif ()
+	endforeach ()
+endif()
+
+add_feature_info(user_models WITH_USER_MODELS "User Models library")
\ No newline at end of file
diff --git a/IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/CMakeLists.txt b/IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..66f1587073f5e9467ab05defc9ccac4a0223ec37
--- /dev/null
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/CMakeLists.txt
@@ -0,0 +1,12 @@
+if (WITH_USER_MODELS)
+	option(CONFLOADER "Configuration loader" ON)
+	add_global_definitions(-DUSER_CONF_LOADER)
+	if (CONFLOADER)
+		add_global_include_dir(src)
+		add_srcs(
+			src/confLoader.h
+			src/confLoader.cpp
+			)
+		add_doxygen_inputs(src)
+	endif()
+endif()
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/src/confLoader.cpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/src/confLoader.cpp
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/src/confLoader.cpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/src/confLoader.cpp
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/src/confLoader.h b/IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/src/confLoader.h
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/conf_loader/src/confLoader.h
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/conf_loader/src/confLoader.h
diff --git a/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/CMakeLists.txt b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8bbcb9ef0b66964860524aa7152416d62b2b909a
--- /dev/null
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/CMakeLists.txt
@@ -0,0 +1,14 @@
+if (WITH_USER_MODELS)
+	if (CONFLOADER)
+		option(ENABLE_EXTRACTOR "Metric extractor included in Q-routing" ON)
+		if(ENABLE_EXTRACTOR)
+			add_global_include_dir(src)
+			add_global_definitions(-DENABLE_EXTRACTOR)
+			add_srcs(
+				src/aux_data_extractor.hpp
+				src/aux_data_extractor.cpp
+			)
+			add_doxygen_inputs(src)
+		endif()
+	endif()
+endif()
diff --git a/IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.cpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
similarity index 73%
rename from IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.cpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
index 7459f3c54a42d9fcfe9313d623a0f398419ea264..c846a9e918795e8b976b10162d7b12aecf5c25f6 100644
--- a/IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.cpp	
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.cpp
@@ -38,13 +38,13 @@ knowledge of the CeCILL-C license and that you accept its terms.
 #include "app_cbr.h"
 #include "network_ip.h"
 
-void RouteExtractor::extract(Node* node, boost::any extra_parameter) {
+void RouteExtractor::extract(Node* node, any extra_parameter) {
 	if (logFile.is_open()) {
 		std::vector<Address> nodeAddrs(node->numberInterfaces);
 		for (int i = 0; i < node->numberInterfaces; i++) {
 			NetworkGetInterfaceInfo(node, i, &nodeAddrs[i]);
 		}
-		boost::any_cast<void(*)(Node*, std::mutex*, std::ofstream*, NodeAddress, std::vector<Address>)>(extra_parameter)(node, &logLock, &logFile, node->nodeId, nodeAddrs);
+		any_cast<void(*)(Node*, std::mutex*, std::ofstream*, NodeAddress, std::vector<Address>)>(extra_parameter)(node, &logLock, &logFile, node->nodeId, nodeAddrs);
 	}
 }
 
@@ -55,7 +55,7 @@ void asyncDropExtraction(NodeAddress nodeId, clocktype now, STAT_NetStatistics n
 	*log_file << networkStats.GetPacketsDroppedQueueOverflow().GetValueAsInt(now) << std::endl;
 }
 
-void DropExtractor::extract(Node* node, boost::any extra_parameter) {
+void DropExtractor::extract(Node* node, any extra_parameter) {
 	if (logFile.is_open()) {
 		auto handler = std::async(std::launch::async, asyncDropExtraction, node->nodeId, node->getNodeTime(), *node->get_networkVar()->newStats, &logLock, &logFile);
 	}
@@ -84,7 +84,7 @@ void asyncAppExtraction(AppInfo appList, clocktype now, std::mutex* lock_file, s
 	}
 }
 
-void AppExtractor::extract(Node* node, boost::any extra_parameter) {
+void AppExtractor::extract(Node* node, any extra_parameter) {
 	if (logFile.is_open()) {
 		AppInfo* appList = node->appData.appPtr;
 		for (; appList != NULL; appList = appList->appNext) {
@@ -98,9 +98,40 @@ void asyncBatteryExtraction(NodeAddress nodeId, clocktype now, double remainingB
 	log_file->operator<<(nodeId) << ";" << now / SECOND << ";" << (int)std::round(remainingBattery) << std::endl;
 }
 
-void BatteryExtractor::extract(Node* node, boost::any extra_parameter)
+void BatteryExtractor::extract(Node* node, any extra_parameter)
 {
 	if (logFile.is_open()) {
 		auto handler = std::async(std::launch::async, asyncBatteryExtraction, node->nodeId, node->getNodeTime(), BatteryGetRemainingCharge(node), &logLock, &logFile);
 	}
-}
\ No newline at end of file
+}
+
+void ForwardTableIPv4Extractor::extract(Node* node, any unuse_parameter)
+{
+	NetworkDataIp* ip = node->get_networkVar();
+	NetworkForwardingTable* rt = &ip->forwardTable;
+	if (logFile.is_open()) {
+		std::vector<Address> nodeAddrs(node->numberInterfaces);
+		for (int i = 0; i < node->numberInterfaces; i++) {
+			NetworkGetInterfaceInfo(node, i, &nodeAddrs[i]);
+		}
+		std::lock_guard<std::mutex> guard(logLock);
+		unsigned int nows = node->getNodeTime() / SECOND;
+		logFile << nows << "NODEINFO;" << node->nodeId;
+		char buf[20];
+		for (size_t i = 0; i < nodeAddrs.size(); i++) {
+			IO_ConvertIpAddressToString(nodeAddrs[i].interfaceAddr.ipv4, buf);
+			logFile << ";" << buf;
+		}
+		logFile << std::endl;
+		for (int i = 0; i < rt->size; i++)
+		{
+			char address[20];
+			IO_ConvertIpAddressToString(NetworkIpGetInterfaceAddress(node, rt->row[i].interfaceIndex), address);
+			logFile << address << ";";
+			IO_ConvertIpAddressToString(rt->row[i].destAddress, address);
+			logFile << address << ";";
+			IO_ConvertIpAddressToString(rt->row[i].nextHopAddress, address);
+			logFile << address << ";" << rt->row[i].cost << ";" << rt->row[i].cost << ";1;0" << std::endl;
+		}
+	}
+}
diff --git a/IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.hpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
similarity index 81%
rename from IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.hpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
index 7dfbd145503259d39b2ca469beef15d07d949c46..85c2bf3c0c2422fac1c969e513788c0e6c661c38 100644
--- a/IWCMC 2021/Original/libraries/user_models/src/aux_data_extractor.hpp	
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/data_extractor/src/aux_data_extractor.hpp
@@ -39,8 +39,15 @@ knowledge of the CeCILL-C license and that you accept its terms.
 #include <ios>
 #include "api.h"
 #include "confLoader.h"
+#if __cplusplus == 201703L
+#include <any>
+using std::any;
+using std::any_cast;
+#else
 #include <boost/any.hpp>
-
+using boost::any;
+using boost::any_cast;
+#endif
 #define CONF_FILE "log.conf"
 
 enum
@@ -61,7 +68,7 @@ protected:
 				if ((BOOL)std::stoi(conf.get_conf("EnableLog" + logType))) {
 					logFile.open(conf.get_conf("logFile" + logType) + ".csv", std::ios::out | std::ios::trunc);
 					if (conf.get_conf("logRate" + logType) != "") {
-						logRate = std::round(std::stod(conf.get_conf("logRate" + logType)) * SECOND);
+						logRate = std::lround(std::stod(conf.get_conf("logRate" + logType)) * SECOND);
 					}
 				}
 			}
@@ -74,7 +81,7 @@ protected:
 		}
 	}
 public:
-	virtual void extract(Node* node, boost::any extra_parameter) = 0;
+	virtual void extract(Node* node, any extra_parameter) = 0;
 	void scheduleLog(Node* node, AppType app) {
 		Message* log = MESSAGE_Alloc(node,
 			APP_LAYER,
@@ -93,26 +100,33 @@ class RouteExtractor : public DataExtractor<RouteExtractor> {
 	friend class DataExtractor<RouteExtractor>;
 	RouteExtractor() : DataExtractor("Route") {}
 public:
-	virtual void extract(Node* node, boost::any callback);
+	virtual void extract(Node* node, any callback);
 };
 
 class DropExtractor : public DataExtractor<DropExtractor> {
 	friend class DataExtractor<DropExtractor>;
 	DropExtractor() : DataExtractor("Drop") {}
 public:
-	virtual void extract(Node* node, boost::any extra_parameter = 0);
+	virtual void extract(Node* node, any extra_parameter = 0);
 };
 
 class AppExtractor : public DataExtractor<AppExtractor> {
 	friend class DataExtractor<AppExtractor>;
 	AppExtractor() : DataExtractor("CBR") {}
 public:
-	virtual void extract(Node* node, boost::any extra_parameter = 0);
+	virtual void extract(Node* node, any extra_parameter = 0);
 };
 
 class BatteryExtractor : public DataExtractor<BatteryExtractor> {
 	friend class DataExtractor<BatteryExtractor>;
 	BatteryExtractor() : DataExtractor("Battery") {}
 public:
-	virtual void extract(Node* node, boost::any unuse_parameter = 0);
+	virtual void extract(Node* node, any unuse_parameter = 0);
+};
+
+class ForwardTableIPv4Extractor : public DataExtractor<ForwardTableIPv4Extractor> {
+	friend class DataExtractor<ForwardTableIPv4Extractor>;
+	ForwardTableIPv4Extractor() : DataExtractor("ForwardTableIPv4"){}
+public:
+	virtual void extract(Node* node, any unuse_parameter = 0);
 };
\ No newline at end of file
diff --git a/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/CMakeLists.txt b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..60e67ba90e0ccd129d1566d9f104d3c86b1b8358
--- /dev/null
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/CMakeLists.txt
@@ -0,0 +1,16 @@
+if (WITH_USER_MODELS)
+	option(QROUTING "Q-routing routing protocol" ON)
+	if (QROUTING)
+		add_global_definitions(-DQROUTING)
+		add_global_include_dir(src)
+		add_doxygen_inputs(src)
+		add_srcs(
+			src/routing_qrouting.cpp
+			src/routing_qrouting.h
+			src/qrouting_route.cpp
+			src/qrouting_route.hpp
+			src/qrouting_table.cpp
+			src/qrouting_table.hpp
+			)
+	endif()
+endif()
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.cpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.cpp
similarity index 98%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.cpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.cpp
index 5337d9c475bd0e696a360028f46d5742a5de6f5a..483ce76141f68cf4755a8c8e43f55baa048415cf 100644
--- a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.cpp	
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.cpp
@@ -39,8 +39,6 @@ knowledge of the CeCILL-C license and that you accept its terms.
 namespace qrouting {
 	unsigned int Route::samplesBeforeEndTrial = 3;
 	unsigned int Route::samplesForAverageLatency = 7;
-	unsigned short Route::coefRSSI = 1;
-	unsigned short Route::coefLatency = 1;
 
 	template <template<typename, class> class V, typename T, class A, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
 	inline T average_container(const V<T, A>& deq) { return deq.empty() ? 0 : std::accumulate(deq.begin(), deq.end(), 0) / (T)deq.size(); }
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.hpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.hpp
similarity index 97%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.hpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.hpp
index 444d1473fc8bb476d44884a61c0bc4f6ece330e6..d746fb270ca5e891fcae80f7d9c8134ff6332bc4 100644
--- a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_route.hpp	
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_route.hpp
@@ -98,8 +98,6 @@ namespace qrouting {
 
 		static void setNbSamplesAverageLatency(const unsigned int nbSamples) { Route::samplesForAverageLatency = nbSamples; }
 		static void setNbSamplesEndTrial(const unsigned int nbSamples) { Route::samplesBeforeEndTrial = nbSamples; }
-		static void setCoefLatency(const unsigned short coef) { Route::coefLatency = coef; }
-		static void setCoefRSSI(const unsigned short coef) { Route::coefRSSI = coef; }
 
 		void setOnTrial(bool value) { onTrial = value; }
 		bool getOnTrial() const { return onTrial; }
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_table.cpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_table.cpp
similarity index 99%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_table.cpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_table.cpp
index fdb11c8781424262702193dd34cc90cd53650270..97ddcbfc01035ccd2f661024aa81cf5e5f6f371a 100644
--- a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_table.cpp	
+++ b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_table.cpp
@@ -160,12 +160,7 @@ namespace qrouting {
 	{
 		if (now > endExplorationPhase) {
 			for (Route* elm : routesToUpdate) {
-				if (linearRegressionStatus) {
-					elm->updateRewardLR(alpha, maxPredictedValue, now, periodicUpdateRate);
-				}
-				else {
-					elm->updateReward(alpha);
-				}
+				elm->updateReward(alpha);
 				Route tmp(chooseAction(elm->getDestAddr(), elm->getSubnetMask()));
 				NetworkUpdateForwardingTable(
 					node,
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_table.hpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_table.hpp
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/qrouting_table.hpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/qrouting_table.hpp
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/routing_qrouting.cpp b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/routing_qrouting.cpp
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/routing_qrouting.cpp
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/routing_qrouting.cpp
diff --git a/IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/routing_qrouting.h b/IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/routing_qrouting.h
similarity index 100%
rename from IWCMC 2021/Q-routing with filtering/libraries/user_models/qrouting/src/routing_qrouting.h
rename to IWCMC_2021/Q-routing_filtering/libraries/user_models/qrouting/src/routing_qrouting.h
diff --git a/IWCMC 2021/README.md b/IWCMC_2021/README.md
similarity index 100%
rename from IWCMC 2021/README.md
rename to IWCMC_2021/README.md
diff --git a/IWCMC 2021/Scenario/hipo/README.md b/IWCMC_2021/Scenario/hipo/README.md
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/README.md
rename to IWCMC_2021/Scenario/hipo/README.md
diff --git a/IWCMC 2021/Scenario/hipo/hipo.app b/IWCMC_2021/Scenario/hipo/hipo.app
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/hipo.app
rename to IWCMC_2021/Scenario/hipo/hipo.app
diff --git a/IWCMC 2021/Scenario/hipo/hipo.config b/IWCMC_2021/Scenario/hipo/hipo.config
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/hipo.config
rename to IWCMC_2021/Scenario/hipo/hipo.config
diff --git a/IWCMC 2021/Scenario/hipo/hipo.display b/IWCMC_2021/Scenario/hipo/hipo.display
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/hipo.display
rename to IWCMC_2021/Scenario/hipo/hipo.display
diff --git a/IWCMC 2021/Scenario/hipo/hipo.nodes b/IWCMC_2021/Scenario/hipo/hipo.nodes
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/hipo.nodes
rename to IWCMC_2021/Scenario/hipo/hipo.nodes
diff --git a/IWCMC 2021/Scenario/hipo/log.conf b/IWCMC_2021/Scenario/hipo/log.conf
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/log.conf
rename to IWCMC_2021/Scenario/hipo/log.conf
diff --git a/IWCMC 2021/Scenario/hipo/qrouting.conf b/IWCMC_2021/Scenario/hipo/qrouting.conf
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/qrouting.conf
rename to IWCMC_2021/Scenario/hipo/qrouting.conf
diff --git a/IWCMC 2021/Scenario/hipo/test.json b/IWCMC_2021/Scenario/hipo/test.json
similarity index 100%
rename from IWCMC 2021/Scenario/hipo/test.json
rename to IWCMC_2021/Scenario/hipo/test.json
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/README.md b/IWCMC_2021/Scenario/wireless_grid_2/README.md
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/README.md
rename to IWCMC_2021/Scenario/wireless_grid_2/README.md
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/log.conf b/IWCMC_2021/Scenario/wireless_grid_2/log.conf
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/log.conf
rename to IWCMC_2021/Scenario/wireless_grid_2/log.conf
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/qrouting.conf b/IWCMC_2021/Scenario/wireless_grid_2/qrouting.conf
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/qrouting.conf
rename to IWCMC_2021/Scenario/wireless_grid_2/qrouting.conf
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/test.json b/IWCMC_2021/Scenario/wireless_grid_2/test.json
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/test.json
rename to IWCMC_2021/Scenario/wireless_grid_2/test.json
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.app b/IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.app
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.app
rename to IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.app
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.config b/IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.config
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.config
rename to IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.config
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.display b/IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.display
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.display
rename to IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.display
diff --git a/IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.nodes b/IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.nodes
similarity index 100%
rename from IWCMC 2021/Scenario/wireless_grid_2/wireless_grid_2.nodes
rename to IWCMC_2021/Scenario/wireless_grid_2/wireless_grid_2.nodes
diff --git a/MLN 2019/README.md b/MLN_2019/README.md
similarity index 100%
rename from MLN 2019/README.md
rename to MLN_2019/README.md
diff --git a/MLN 2019/Scenario/grid94/README.md b/MLN_2019/Scenario/grid94/README.md
similarity index 100%
rename from MLN 2019/Scenario/grid94/README.md
rename to MLN_2019/Scenario/grid94/README.md
diff --git a/MLN 2019/Scenario/grid94/Seeds.txt b/MLN_2019/Scenario/grid94/Seeds.txt
similarity index 100%
rename from MLN 2019/Scenario/grid94/Seeds.txt
rename to MLN_2019/Scenario/grid94/Seeds.txt
diff --git a/MLN 2019/Scenario/grid94/grid94.app b/MLN_2019/Scenario/grid94/grid94.app
similarity index 100%
rename from MLN 2019/Scenario/grid94/grid94.app
rename to MLN_2019/Scenario/grid94/grid94.app
diff --git a/MLN 2019/Scenario/grid94/grid94.config b/MLN_2019/Scenario/grid94/grid94.config
similarity index 100%
rename from MLN 2019/Scenario/grid94/grid94.config
rename to MLN_2019/Scenario/grid94/grid94.config
diff --git a/MLN 2019/Scenario/grid94/grid94.display b/MLN_2019/Scenario/grid94/grid94.display
similarity index 100%
rename from MLN 2019/Scenario/grid94/grid94.display
rename to MLN_2019/Scenario/grid94/grid94.display
diff --git a/MLN 2019/Scenario/grid94/grid94.nodes b/MLN_2019/Scenario/grid94/grid94.nodes
similarity index 100%
rename from MLN 2019/Scenario/grid94/grid94.nodes
rename to MLN_2019/Scenario/grid94/grid94.nodes
diff --git a/MLN 2019/Scenario/grid94/log.conf b/MLN_2019/Scenario/grid94/log.conf
similarity index 100%
rename from MLN 2019/Scenario/grid94/log.conf
rename to MLN_2019/Scenario/grid94/log.conf
diff --git a/MLN 2019/Scenario/grid94/qrouting.conf b/MLN_2019/Scenario/grid94/qrouting.conf
similarity index 100%
rename from MLN 2019/Scenario/grid94/qrouting.conf
rename to MLN_2019/Scenario/grid94/qrouting.conf
diff --git a/MLN 2019/Scenario/toy_example/README.md b/MLN_2019/Scenario/toy_example/README.md
similarity index 100%
rename from MLN 2019/Scenario/toy_example/README.md
rename to MLN_2019/Scenario/toy_example/README.md
diff --git a/MLN 2019/Scenario/toy_example/Seeds.txt b/MLN_2019/Scenario/toy_example/Seeds.txt
similarity index 100%
rename from MLN 2019/Scenario/toy_example/Seeds.txt
rename to MLN_2019/Scenario/toy_example/Seeds.txt
diff --git a/MLN 2019/Scenario/toy_example/log.conf b/MLN_2019/Scenario/toy_example/log.conf
similarity index 100%
rename from MLN 2019/Scenario/toy_example/log.conf
rename to MLN_2019/Scenario/toy_example/log.conf
diff --git a/MLN 2019/Scenario/toy_example/qrouting.conf b/MLN_2019/Scenario/toy_example/qrouting.conf
similarity index 100%
rename from MLN 2019/Scenario/toy_example/qrouting.conf
rename to MLN_2019/Scenario/toy_example/qrouting.conf
diff --git a/MLN 2019/Scenario/toy_example/toy_example.app b/MLN_2019/Scenario/toy_example/toy_example.app
similarity index 100%
rename from MLN 2019/Scenario/toy_example/toy_example.app
rename to MLN_2019/Scenario/toy_example/toy_example.app
diff --git a/MLN 2019/Scenario/toy_example/toy_example.config b/MLN_2019/Scenario/toy_example/toy_example.config
similarity index 100%
rename from MLN 2019/Scenario/toy_example/toy_example.config
rename to MLN_2019/Scenario/toy_example/toy_example.config
diff --git a/MLN 2019/Scenario/toy_example/toy_example.display b/MLN_2019/Scenario/toy_example/toy_example.display
similarity index 100%
rename from MLN 2019/Scenario/toy_example/toy_example.display
rename to MLN_2019/Scenario/toy_example/toy_example.display
diff --git a/MLN 2019/Scenario/toy_example/toy_example.nodes b/MLN_2019/Scenario/toy_example/toy_example.nodes
similarity index 100%
rename from MLN 2019/Scenario/toy_example/toy_example.nodes
rename to MLN_2019/Scenario/toy_example/toy_example.nodes
diff --git a/MLN 2019/libraries/CMakeLists.txt b/MLN_2019/libraries/CMakeLists.txt
similarity index 100%
rename from MLN 2019/libraries/CMakeLists.txt
rename to MLN_2019/libraries/CMakeLists.txt
diff --git a/MLN 2019/libraries/user_models/CMakeLists.txt b/MLN_2019/libraries/user_models/CMakeLists.txt
similarity index 100%
rename from MLN 2019/libraries/user_models/CMakeLists.txt
rename to MLN_2019/libraries/user_models/CMakeLists.txt
diff --git a/MLN 2019/libraries/user_models/src/aux_data_extractor.cpp b/MLN_2019/libraries/user_models/src/aux_data_extractor.cpp
similarity index 100%
rename from MLN 2019/libraries/user_models/src/aux_data_extractor.cpp
rename to MLN_2019/libraries/user_models/src/aux_data_extractor.cpp
diff --git a/MLN 2019/libraries/user_models/src/aux_data_extractor.hpp b/MLN_2019/libraries/user_models/src/aux_data_extractor.hpp
similarity index 100%
rename from MLN 2019/libraries/user_models/src/aux_data_extractor.hpp
rename to MLN_2019/libraries/user_models/src/aux_data_extractor.hpp
diff --git a/MLN 2019/libraries/user_models/src/aux_q.cpp b/MLN_2019/libraries/user_models/src/aux_q.cpp
similarity index 100%
rename from MLN 2019/libraries/user_models/src/aux_q.cpp
rename to MLN_2019/libraries/user_models/src/aux_q.cpp
diff --git a/MLN 2019/libraries/user_models/src/aux_q.h b/MLN_2019/libraries/user_models/src/aux_q.h
similarity index 100%
rename from MLN 2019/libraries/user_models/src/aux_q.h
rename to MLN_2019/libraries/user_models/src/aux_q.h
diff --git a/MLN 2019/libraries/user_models/src/confLoader.cpp b/MLN_2019/libraries/user_models/src/confLoader.cpp
similarity index 100%
rename from MLN 2019/libraries/user_models/src/confLoader.cpp
rename to MLN_2019/libraries/user_models/src/confLoader.cpp
diff --git a/MLN 2019/libraries/user_models/src/confLoader.h b/MLN_2019/libraries/user_models/src/confLoader.h
similarity index 100%
rename from MLN 2019/libraries/user_models/src/confLoader.h
rename to MLN_2019/libraries/user_models/src/confLoader.h
diff --git a/MLN 2019/libraries/user_models/src/routing_qrouting.cpp b/MLN_2019/libraries/user_models/src/routing_qrouting.cpp
similarity index 100%
rename from MLN 2019/libraries/user_models/src/routing_qrouting.cpp
rename to MLN_2019/libraries/user_models/src/routing_qrouting.cpp
diff --git a/MLN 2019/libraries/user_models/src/routing_qrouting.h b/MLN_2019/libraries/user_models/src/routing_qrouting.h
similarity index 100%
rename from MLN 2019/libraries/user_models/src/routing_qrouting.h
rename to MLN_2019/libraries/user_models/src/routing_qrouting.h
diff --git a/README.md b/README.md
index b2ab2b7c8e153ba1bb79c9fc385f1306345e11d4..aedf9c84e5f6242b24af0ac7f67f7a23a422fb18 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ In order to compile these source code, you need:
 
 #### Compilation requirement for Qualnet 9.2 / 9.3
 In order to compile these source code, you need:
-* Qualnet 9.2 Developer (to get access to Qualnet source code, not provided),
+* Qualnet 9.2/9.3 Developer (to get access to Qualnet source code, not provided),
 * VS2017+ / GCC 7+
 * CMake (>= 3.16)
 * all the libraries needed in order to compile Qualnet
diff --git a/extra scenarios/grid94m1/README.md b/extra_scenarios/grid94m1/README.md
similarity index 100%
rename from extra scenarios/grid94m1/README.md
rename to extra_scenarios/grid94m1/README.md
diff --git a/extra scenarios/grid94m1/grid94.app b/extra_scenarios/grid94m1/grid94.app
similarity index 100%
rename from extra scenarios/grid94m1/grid94.app
rename to extra_scenarios/grid94m1/grid94.app
diff --git a/extra scenarios/grid94m1/grid94.config b/extra_scenarios/grid94m1/grid94.config
similarity index 100%
rename from extra scenarios/grid94m1/grid94.config
rename to extra_scenarios/grid94m1/grid94.config
diff --git a/extra scenarios/grid94m1/grid94.display b/extra_scenarios/grid94m1/grid94.display
similarity index 100%
rename from extra scenarios/grid94m1/grid94.display
rename to extra_scenarios/grid94m1/grid94.display
diff --git a/extra scenarios/grid94m1/grid94.nodes b/extra_scenarios/grid94m1/grid94.nodes
similarity index 100%
rename from extra scenarios/grid94m1/grid94.nodes
rename to extra_scenarios/grid94m1/grid94.nodes
diff --git a/extra scenarios/grid94m1/log.conf b/extra_scenarios/grid94m1/log.conf
similarity index 100%
rename from extra scenarios/grid94m1/log.conf
rename to extra_scenarios/grid94m1/log.conf
diff --git a/extra scenarios/grid94m1/qrouting.conf b/extra_scenarios/grid94m1/qrouting.conf
similarity index 100%
rename from extra scenarios/grid94m1/qrouting.conf
rename to extra_scenarios/grid94m1/qrouting.conf
diff --git a/extra scenarios/grid94m1/test.json b/extra_scenarios/grid94m1/test.json
similarity index 100%
rename from extra scenarios/grid94m1/test.json
rename to extra_scenarios/grid94m1/test.json
diff --git a/patch_integration_qualnet_9.3.patch b/patch_integration_qualnet_9.3.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2322a26423d677033800f21e7dafe1862e7a737c
--- /dev/null
+++ b/patch_integration_qualnet_9.3.patch
@@ -0,0 +1,1844 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 65c082b..942d5ff 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -33,22 +33,7 @@ include(gen_references)
+ 
+ project(${BUILD_TARGET})
+ 
+-set(CMAKE_CXX_STANDARD 14)
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++set(CMAKE_CXX_STANDARD 17)
+ 
+ if (UNIX)
+     if (NOT DEFINED HAVE_NO_PIE)
+diff --git a/core/network/enum_NetworkRoutingAdminDistanceType.h.in b/core/network/enum_NetworkRoutingAdminDistanceType.h.in
+index c670626..fedf66a 100644
+--- a/core/network/enum_NetworkRoutingAdminDistanceType.h.in
++++ b/core/network/enum_NetworkRoutingAdminDistanceType.h.in
+@@ -31,6 +31,14 @@ static const int ROUTING_ADMIN_DISTANCE_OSPFv3 = 115;
+ static const int ROUTING_ADMIN_DISTANCE_OLSRv2_NIIGATA = 116;
+ static const int ROUTING_ADMIN_DISTANCE_FSRL = 210;
+ static const int ROUTING_ADMIN_DISTANCE_DEFAULT = 255;
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++static const int ROUTING_ADMIN_DISTANCE_QROUTING = 220;	// Q-ROUTING
++#endif
++#ifdef MP_OLSR
++static const int ROUTING_ADMIN_DISTANCE_MPOLSRv2_NIIGATA = 221;	// MP_OLSR
++#endif
++#endif
+ // end enum NetworkRoutingAdminDistanceType
+ #endif
+ @OTHER_INCLUDES@
+diff --git a/core/network/enum_NetworkRoutingProtocolType.h.in b/core/network/enum_NetworkRoutingProtocolType.h.in
+index 67d757c..89f8dfa 100644
+--- a/core/network/enum_NetworkRoutingProtocolType.h.in
++++ b/core/network/enum_NetworkRoutingProtocolType.h.in
+@@ -65,6 +65,14 @@ static const int ROUTING_PROTOCOL_OSPFv2_TYPE2_EXTERNAL = 5225;
+ static const int ROUTING_PROTOCOL_EIGRP_EXTERNAL = 5226;
+ static const int NETWORK_TUNNEL_GRE = 5227;
+ static const int ROUTING_PROTOCOL_NONE = 5228;
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++static const int ROUTING_PROTOCOL_QROUTING = 5220;	// Q-ROUTING
++#endif
++#ifdef MP_OLSR
++static const int ROUTING_PROTOCOL_MPOLSRv2_NIIGATA = 5221;	// MP_OLSR
++#endif
++#endif
+ // end enum NetworkRoutingProtocolType
+ #endif
+ @OTHER_INCLUDES@
+diff --git a/include/UrbanCache.h b/include/UrbanCache.h
+index 5fa75ca..6d1113c 100644
+--- a/include/UrbanCache.h
++++ b/include/UrbanCache.h
+@@ -9,6 +9,7 @@
+ #include <boost/functional/hash.hpp>
+ #include <boost/shared_ptr.hpp>
+ #include "Cache.h"
++#include <functional>
+ 
+ /// Coordinate type for the Urban Cache
+ typedef int UrbanCacheCoord;
+@@ -64,7 +65,9 @@ inline bool operator==(const UrbanCacheLine& lhs, const UrbanCacheLine& rhs)
+ /// The hash algorithm has to combine the four endpoints of the line segment.
+ /// Therefore, this implementation uses boost::hash_combine that is based on
+ /// boost::hash_value.
+-struct HashUrbanCacheLine : public std::unary_function<UrbanCacheLine, size_t>
++
++
++struct HashUrbanCacheLine : public std::function<std::size_t(UrbanCacheLine)>
+ {
+     size_t operator()(const UrbanCacheLine& v) const
+     {
+diff --git a/include/application.h b/include/application.h
+index 54d5903..9ea3eb8 100644
+--- a/include/application.h
++++ b/include/application.h
+@@ -260,6 +260,18 @@ enum AppType
+     APP_UDM,
+     APP_GNB,
+     APP_PLACEHOLDER
++
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++, APP_ROUTING_QROUTING
++#endif
++#ifdef MP_OLSR
++, APP_ROUTING_MPOLSRv2_NIIGATA
++#endif
++#ifdef UNFIXED_COMMS
++, APP_UNFIXED_COMMS
++#endif
++#endif
+ };
+ 
+ /// Information relevant to specific app layer protocol
+@@ -596,6 +608,13 @@ struct AppData
+     std::map<Address, UInt8> btConnectedDestMaxPktSizeMap;
+     std::set<BtAppSessionData*, BtAppSeesionDataComp>  btAppInfoSet;
+     std::map<Address, Message*> btReconnectionTimerMap;
++
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++    void* qrouting;  /* QRouting - not standard */
++#endif
++#endif
++
+ };
+ 
+ #define APP_TIMER_SEND_PKT     (1)  /* for sending a packet */
+diff --git a/include/qualnet_socket.h b/include/qualnet_socket.h
+index 5a0187f..4c28e66 100644
+--- a/include/qualnet_socket.h
++++ b/include/qualnet_socket.h
+@@ -20,6 +20,7 @@
+ 
+ #include <list>
+ #include <deque>
++#include <functional>
+ 
+ #include "message.h"
+ #include "types.h"
+@@ -467,7 +468,8 @@ private:
+ // Class       :: SOCK_MatchConnId
+ // DESCRIPTION :: Function object used to search socket with specified connection ID
+ // **/
+-struct SOCK_MatchConnId : public std::unary_function<SOCK_Socket*, bool> {
++
++struct SOCK_MatchConnId : public std::function<bool(SOCK_Socket*)> {
+     int m_ConnId;
+     SOCK_MatchConnId(int connId):m_ConnId(connId) { }
+     bool operator()(const SOCK_Socket* sock) const
+diff --git a/include/timer_manager.h b/include/timer_manager.h
+index c4ad080..e56703c 100644
+--- a/include/timer_manager.h
++++ b/include/timer_manager.h
+@@ -4,9 +4,10 @@
+ #include <vector>
+ #include <queue>
+ #include <stack>
++#include <functional>
+ 
+ 
+-struct MessageCompare : std::binary_function<Message*, Message*, bool>
++struct MessageCompare : std::function<bool(Message*, Message*)>
+ {
+     bool operator()(const Message *m1, const Message *m2) const
+     {
+diff --git a/interfaces/agi/src/STK10/agi_interface_util_stk10_create.h b/interfaces/agi/src/STK10/agi_interface_util_stk10_create.h
+index 68e52d0..1e207c9 100644
+--- a/interfaces/agi/src/STK10/agi_interface_util_stk10_create.h
++++ b/interfaces/agi/src/STK10/agi_interface_util_stk10_create.h
+@@ -1,4 +1,7 @@
+ #pragma once
++#ifdef _WIN32
++#define _HAS_STD_BYTE 0
++#endif
+ #include "..\agi_common_interfaces.h"
+ 
+ IAgiInterfaceUtil* CreateSTK10Util();
+diff --git a/interfaces/agi/src/STK11/agi_interface_util_stk11_create.h b/interfaces/agi/src/STK11/agi_interface_util_stk11_create.h
+index a2b7e24..ffa1e4f 100644
+--- a/interfaces/agi/src/STK11/agi_interface_util_stk11_create.h
++++ b/interfaces/agi/src/STK11/agi_interface_util_stk11_create.h
+@@ -1,4 +1,7 @@
+ #pragma once
++#ifdef _WIN32
++#define _HAS_STD_BYTE 0
++#endif
+ #include "..\agi_common_interfaces.h"
+ 
+ IAgiInterfaceUtil* CreateSTK11Util();
+diff --git a/interfaces/agi/src/STK12/agi_interface_util_stk12_create.h b/interfaces/agi/src/STK12/agi_interface_util_stk12_create.h
+index 06e8193..d39bfee 100644
+--- a/interfaces/agi/src/STK12/agi_interface_util_stk12_create.h
++++ b/interfaces/agi/src/STK12/agi_interface_util_stk12_create.h
+@@ -1,4 +1,7 @@
+ #pragma once
++#ifdef _WIN32
++#define _HAS_STD_BYTE 0
++#endif
+ #include "..\agi_common_interfaces.h"
+ 
+ IAgiInterfaceUtil* CreateSTK12Util();
+diff --git a/interfaces/agi/src/STK9/agi_interface_util_stk9_create.h b/interfaces/agi/src/STK9/agi_interface_util_stk9_create.h
+index c3f1a46..defa8de 100644
+--- a/interfaces/agi/src/STK9/agi_interface_util_stk9_create.h
++++ b/interfaces/agi/src/STK9/agi_interface_util_stk9_create.h
+@@ -1,4 +1,8 @@
+ #pragma once
++#ifdef _WIN32
++#define _HAS_STD_BYTE 0
++#endif
++
+ #include "..\agi_common_interfaces.h"
+ 
+ IAgiInterfaceUtil* CreateSTK9Util();
+diff --git a/interfaces/agi/src/agi_interface_id_impl.h b/interfaces/agi/src/agi_interface_id_impl.h
+index d68032a..3cc0012 100644
+--- a/interfaces/agi/src/agi_interface_id_impl.h
++++ b/interfaces/agi/src/agi_interface_id_impl.h
+@@ -1,5 +1,9 @@
+ #pragma once
+ 
++#ifdef _WIN32
++#define _HAS_STD_BYTE 0
++#endif
++
+ #include <unknwn.h>
+ #include "agi_interface_smart_ptr.h"
+ 
+diff --git a/interfaces/agi/src/agi_interface_signal_impl.h b/interfaces/agi/src/agi_interface_signal_impl.h
+index 97e7f37..4a44de2 100644
+--- a/interfaces/agi/src/agi_interface_signal_impl.h
++++ b/interfaces/agi/src/agi_interface_signal_impl.h
+@@ -76,7 +76,7 @@ HRESULT STDMETHODCALLTYPE CAgiInterfaceSignalImpl<T>::QueryInterface(
+         return S_OK;
+     }
+ 
+-    if (IsEqualIID(riid, __uuidof(IAgStkCommUtilSignal)))
++    if (IsEqualIID(riid, __uuidof(AgStkCommUtilLib::IAgStkCommUtilSignal)))
+     {
+         *ppvObject = static_cast<AgStkCommUtilLib::IAgStkCommUtilSignal*>(this);
+         AddRef();
+diff --git a/interfaces/auto-ipne/src/mdp_interface.cpp b/interfaces/auto-ipne/src/mdp_interface.cpp
+index 3e3cb90..f8faa64 100644
+--- a/interfaces/auto-ipne/src/mdp_interface.cpp
++++ b/interfaces/auto-ipne/src/mdp_interface.cpp
+@@ -87,7 +87,7 @@ BOOL MDPPacketHandler::MDPSwapBytes(unsigned char* mdpPacket,
+                                     BOOL in)
+ {
+     MdpMessage msg;
+-    register UInt32 len = 0;
++    UInt32 len = 0;
+     Int32 count = 0;
+     unsigned char* buffer = mdpPacket;
+     BOOL isServerMsg = TRUE;
+diff --git a/interfaces/net-snmp/src/MIBII/ifmib_netsnmp.h b/interfaces/net-snmp/src/MIBII/ifmib_netsnmp.h
+index 4c78ca5..440e8ad 100644
+--- a/interfaces/net-snmp/src/MIBII/ifmib_netsnmp.h
++++ b/interfaces/net-snmp/src/MIBII/ifmib_netsnmp.h
+@@ -1,5 +1,5 @@
+ #ifndef IFMIB_NETSNMP_H
+-#define IFMIBNETSNMP_H
++#define IFMIB_NETSNMP_H
+ 
+ 
+ #define IFNAME 1
+diff --git a/interfaces/net-snmp/src/net-snmp/asn1_netsnmp.cpp b/interfaces/net-snmp/src/net-snmp/asn1_netsnmp.cpp
+index 5a05303..0736c18 100644
+--- a/interfaces/net-snmp/src/net-snmp/asn1_netsnmp.cpp
++++ b/interfaces/net-snmp/src/net-snmp/asn1_netsnmp.cpp
+@@ -424,9 +424,9 @@ asn_parse_int(u_char*  data,
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+     static const char* errpre = "parse int";
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+-    register long   value = 0;
++    long   value = 0;
+ 
+     if (intsize != sizeof(long)) {
+         _asn_size_err(errpre, intsize, sizeof(long));
+@@ -487,9 +487,9 @@ asn_parse_unsigned_int(u_char*  data,
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+     static const char* errpre = "parse uint";
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+-    register u_long value = 0;
++    u_long value = 0;
+ 
+     if (intsize != sizeof(long)) {
+         _asn_size_err(errpre, intsize, sizeof(long));
+@@ -551,8 +551,8 @@ asn_build_int(u_char*  data,
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+     static const char* errpre = "build int";
+-    register long   integer;
+-    register u_long mask;
++    long   integer;
++    u_long mask;
+ 
+     if (intsize != sizeof(long)) {
+         _asn_size_err(errpre, intsize, sizeof(long));
+@@ -625,9 +625,9 @@ asn_build_unsigned_int(u_char*  data,
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+     static const char* errpre = "build uint";
+-    register u_long integer;
+-    register u_long mask;
+-    register u_long temp;
++    u_long integer;
++    u_long mask;
++    u_long temp;
+     int             add_null_byte = 0;
+ 
+     if (intsize != sizeof(long)) {
+@@ -817,7 +817,7 @@ NetSnmpAgent::asn_build_string(u_char*  data,
+ u_char*
+ asn_parse_header(u_char*  data, size_t*  datalength, u_char*  type)
+ {
+-    register u_char* bufp;
++    u_char* bufp;
+     u_long          asn_length;
+ 
+     if (!data || !datalength || !type) {
+@@ -1014,7 +1014,7 @@ asn_parse_length(u_char*  data, u_long*  length)
+ {
+     static const char* errpre = "parse length";
+     char            ebuf[128];
+-    register u_char lengthbyte;
++    u_char lengthbyte;
+ 
+     if (!data || !length) {
+         return NULL;
+@@ -1159,10 +1159,10 @@ asn_parse_objid(u_char*  data,
+      * leadingbyte ::= 1 7bitvalue
+      * lastbyte ::= 0 7bitvalue
+      */
+-    register u_char* bufp = data;
+-    register oid*   oidp = objid + 1;
+-    register u_long subidentifier;
+-    register long   length;
++    u_char* bufp = data;
++    oid*   oidp = objid + 1;
++    u_long subidentifier;
++    long   length;
+     u_long          asn_length;
+     size_t          original_length = *objidlength;
+ 
+@@ -1274,11 +1274,11 @@ asn_build_objid(u_char*  data,
+      * lastbyte ::= 0 7bitvalue
+      */
+     size_t          asnlength;
+-    register oid*   op = objid;
++    oid*   op = objid;
+     u_char          objid_size[MAX_OID_LEN];
+-    register u_long objid_val = 0;
++    u_long objid_val = 0;
+     u_long          first_objid_val;
+-    register int    i;
++    int    i;
+     /*
+      * check if there are at least 2 sub-identifiers
+      */
+@@ -1429,7 +1429,7 @@ asn_parse_null(u_char*  data, size_t*  datalength, u_char*  type)
+     /*
+      * ASN.1 null ::= 0x05 0x00
+      */
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+ 
+     *type = *bufp++;
+@@ -1509,7 +1509,7 @@ asn_parse_bitstring(u_char*  data,
+      * bitstring ::= 0x03 asnlength unused {byte}*
+      */
+     static const char* errpre = "parse bitstring";
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+ 
+     *type = *bufp++;
+@@ -1614,9 +1614,9 @@ asn_parse_unsigned_int64(u_char*  data,
+      */
+     static const char* errpre = "parse uint64";
+     const int       uint64sizelimit = (4 * 2) + 1;
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+-    register u_long low = 0, high = 0;
++    u_long low = 0, high = 0;
+ 
+     if (countersize != sizeof(struct counter64)) {
+         _asn_size_err(errpre, countersize, sizeof(struct counter64));
+@@ -1707,8 +1707,8 @@ asn_build_unsigned_int64(u_char*  data,
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+ 
+-    register u_long low, high;
+-    register u_long mask, mask2;
++    u_long low, high;
++    u_long mask, mask2;
+     int             add_null_byte = 0;
+     size_t          intsize;
+ 
+@@ -1859,9 +1859,9 @@ asn_parse_signed_int64(u_char*  data,
+     static const char* errpre = "parse int64";
+     const int       int64sizelimit = (4 * 2) + 1;
+     char            ebuf[128];
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+-    register u_int  low = 0, high = 0;
++    u_int  low = 0, high = 0;
+ 
+     if (countersize != sizeof(struct counter64)) {
+         _asn_size_err(errpre, countersize, sizeof(struct counter64));
+@@ -1957,7 +1957,7 @@ asn_build_signed_int64(u_char*  data,
+      */
+ 
+     struct counter64 c64;
+-    register u_int  mask, mask2;
++    u_int  mask, mask2;
+     u_long          low, high;
+     size_t          intsize;
+     if (countersize != sizeof(struct counter64)) {
+@@ -2043,7 +2043,7 @@ asn_parse_float(u_char*  data,
+                 size_t*  datalength,
+                 u_char*  type, float* floatp, size_t floatsize)
+ {
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+     union {
+         float           floatVal;
+@@ -2197,7 +2197,7 @@ asn_parse_double(u_char*  data,
+                  size_t*  datalength,
+                  u_char*  type, double* doublep, size_t doublesize)
+ {
+-    register u_char* bufp = data;
++    u_char* bufp = data;
+     u_long          asn_length;
+     long            tmp;
+     union {
+@@ -2500,7 +2500,7 @@ asn_realloc_rbuild_int(u_char**  pkt, size_t*  pkt_len,
+                        u_char type, const long* intp, size_t intsize)
+ {
+     static const char* errpre = "build int";
+-    register long   integer = *intp;
++    long   integer = *intp;
+     int             testvalue;
+     size_t          start_offset = *offset;
+ 
+@@ -2622,7 +2622,7 @@ NetSnmpAgent::asn_realloc_rbuild_unsigned_int(u_char**  pkt, size_t*  pkt_len,
+                             u_char type, const u_long*  intp, size_t intsize)
+ {
+     static const char* errpre = "build uint";
+-    register u_long integer = *intp;
++    u_long integer = *intp;
+     size_t          start_offset = *offset;
+ 
+     if (intsize != sizeof(unsigned long)) {
+@@ -2728,8 +2728,8 @@ NetSnmpAgent::asn_realloc_rbuild_objid(u_char**  pkt, size_t*  pkt_len,
+      * leadingbyte ::= 1 7bitvalue
+      * lastbyte ::= 0 7bitvalue
+      */
+-    register size_t i;
+-    register oid    tmpint;
++    size_t i;
++    oid    tmpint;
+     size_t          start_offset = *offset;
+     const char*     errpre = "build objid";
+ 
+@@ -2930,7 +2930,7 @@ NetSnmpAgent::asn_realloc_rbuild_unsigned_int64(u_char**  pkt, size_t*  pkt_len,
+     /*
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+-    register u_long low = cp->low, high = cp->high;
++    u_long low = cp->low, high = cp->high;
+     size_t          intsize, start_offset = *offset;
+     int             count;
+ 
+@@ -3110,7 +3110,7 @@ asn_realloc_rbuild_signed_int64(u_char**  pkt, size_t*  pkt_len,
+     /*
+      * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+      */
+-    register long low = cp->low, high = cp->high;
++    long low = cp->low, high = cp->high;
+     size_t          intsize, start_offset = *offset;
+     int             count, testvalue = (high & 0x80000000) ? -1 : 0;
+ 
+diff --git a/interfaces/net-snmp/src/net-snmp/mib_netsnmp.cpp b/interfaces/net-snmp/src/net-snmp/mib_netsnmp.cpp
+index c2aa9ed..7e54235 100644
+--- a/interfaces/net-snmp/src/net-snmp/mib_netsnmp.cpp
++++ b/interfaces/net-snmp/src/net-snmp/mib_netsnmp.cpp
+@@ -901,7 +901,7 @@ NetSnmpAgent::get_wild_node(const char* name, oid*  objid, size_t*  objidlen)
+ 
+ 
+ void
+-clear_tree_flags(register struct tree* tp)
++clear_tree_flags(struct tree* tp)
+ {
+     for (; tp; tp = tp->next_peer) {
+         tp->reported = 0;
+diff --git a/interfaces/net-snmp/src/net-snmp/parse_netsnmp.cpp b/interfaces/net-snmp/src/net-snmp/parse_netsnmp.cpp
+index b0ba6de..32a4c61 100644
+--- a/interfaces/net-snmp/src/net-snmp/parse_netsnmp.cpp
++++ b/interfaces/net-snmp/src/net-snmp/parse_netsnmp.cpp
+@@ -548,7 +548,7 @@ NetSnmpAgent::is_labelchar(int ich)
+ int
+ NetSnmpAgent::parseQuoteString(FILE*  fp, char* token, int maxtlen)
+ {
+-    register int    ch;
++    int    ch;
+     int             count = 0;
+     int             too_long = 0;
+     char*           token_start = token;
+@@ -592,10 +592,10 @@ NetSnmpAgent::parseQuoteString(FILE*  fp, char* token, int maxtlen)
+ int
+ NetSnmpAgent::get_token(FILE*  fp, char* token, int maxtlen)
+ {
+-    register int    ch, ch_next;
+-    register char*  cp = token;
+-    register int    hash = 0;
+-    register struct tok* tp = NULL;
++    int    ch, ch_next;
++    char*  cp = token;
++    int    hash = 0;
++    struct tok* tp = NULL;
+     int             too_long = 0;
+     enum { bdigits, xdigits, other } seenSymbols;
+ 
+@@ -1403,8 +1403,8 @@ NetSnmpAgent::find_best_tree_node(const char* pattrn, struct tree* tree_top,
+ void
+ NetSnmpAgent::netsnmp_init_mib_internals(void)
+ {
+-    register struct tok* tp;
+-    register int    b, i;
++    struct tok* tp;
++    int    b, i;
+     int             max_modc;
+ 
+     if (tree_head)
+@@ -1937,7 +1937,7 @@ NetSnmpAgent::get_tc(const char* descriptor,
+ struct enum_list*
+ NetSnmpAgent::parse_enumlist(FILE*  fp, struct enum_list** retp)
+ {
+-    register int    type;
++    int    type;
+     char            token[MAXTOKEN];
+     struct enum_list* ep = NULL, **epp = &ep;
+ 
+@@ -2112,12 +2112,12 @@ NetSnmpAgent::tossObjectIdentifier(FILE*  fp)
+ struct NetSnmpNode*
+ NetSnmpAgent::parse_objecttype(FILE*  fp, char* name)
+ {
+-    register int    type;
++    int    type;
+     char            token[MAXTOKEN];
+     char            nexttoken[MAXTOKEN];
+     char            quoted_string_buffer[MAXQUOTESTR];
+     int             nexttype, tctype;
+-    register struct NetSnmpNode* np;
++    struct NetSnmpNode* np;
+ 
+     type = get_token(fp, token, MAXTOKEN);
+     if (type != SYNTAX) {
+@@ -2501,10 +2501,10 @@ struct varbind_list*
+ struct NetSnmpNode*
+ NetSnmpAgent::parse_trapDefinition(FILE*  fp, char* name)
+ {
+-    register int    type;
++    int    type;
+     char            token[MAXTOKEN];
+     char            quoted_string_buffer[MAXQUOTESTR];
+-    register struct NetSnmpNode* np;
++    struct NetSnmpNode* np;
+ 
+     np = alloc_node(current_module);
+     if (np == NULL)
+@@ -2601,10 +2601,10 @@ NetSnmpAgent::parse_trapDefinition(FILE*  fp, char* name)
+ struct NetSnmpNode*
+ NetSnmpAgent::parse_notificationDefinition(FILE*  fp, char* name)
+ {
+-    register int    type;
++    int    type;
+     char            token[MAXTOKEN];
+     char            quoted_string_buffer[MAXQUOTESTR];
+-    register struct NetSnmpNode* np;
++    struct NetSnmpNode* np;
+ 
+     np = alloc_node(current_module);
+     if (np == NULL)
+@@ -2949,8 +2949,8 @@ struct NetSnmpNode*
+ struct NetSnmpNode*
+     NetSnmpAgent::parse_objectid(FILE*  fp, char* name)
+ {
+-    register int    count;
+-    register struct subid_s* op, *nop;
++    int    count;
++    struct subid_s* op, *nop;
+     int             length;
+     struct subid_s  loid[32];
+     struct NetSnmpNode*    np, *root = NULL, *oldnp = NULL;
+@@ -3640,7 +3640,7 @@ int
+ NetSnmpAgent::getoid(FILE*  fp, struct subid_s* id,   /* an array of subids */
+        int length)
+ {                               /* the length of the array */
+-    register int    count;
++    int    count;
+     int             type;
+     char            token[MAXTOKEN];
+ 
+diff --git a/interfaces/net-snmp/src/net-snmp/snmp_api_netsnmp.cpp b/interfaces/net-snmp/src/net-snmp/snmp_api_netsnmp.cpp
+index c43038d..76e9329 100644
+--- a/interfaces/net-snmp/src/net-snmp/snmp_api_netsnmp.cpp
++++ b/interfaces/net-snmp/src/net-snmp/snmp_api_netsnmp.cpp
+@@ -756,9 +756,9 @@ int
+ netsnmp_oid_equals(const unsigned int*  in_name1,
+                    size_t len1, const unsigned int*  in_name2, size_t len2)
+ {
+-    register const unsigned int* name1 = in_name1;
+-    register const unsigned int* name2 = in_name2;
+-    register int    len = len1;
++    const unsigned int* name1 = in_name1;
++    const unsigned int* name2 = in_name2;
++    int    len = len1;
+ 
+     /*
+      * len = minimum of len1 and len2
+@@ -796,9 +796,9 @@ int
+ snmp_oid_compare(const oid*  in_name1,
+                  size_t len1, const oid*  in_name2, size_t len2)
+ {
+-    register int    len;
+-    register const oid* name1 = in_name1;
+-    register const oid* name2 = in_name2;
++    int    len;
++    const oid* name1 = in_name1;
++    const oid* name2 = in_name2;
+ 
+     /*
+      * len = minimum of len1 and len2
+@@ -888,9 +888,9 @@ netsnmp_oid_compare_ll(const unsigned int*  in_name1,
+                        size_t len1, const unsigned int*  in_name2, size_t len2,
+                        size_t* offpt)
+ {
+-    register int    len;
+-    register const unsigned int* name1 = in_name1;
+-    register const unsigned int* name2 = in_name2;
++    int    len;
++    const unsigned int* name1 = in_name1;
++    const unsigned int* name2 = in_name2;
+     int initlen;
+ 
+     /*
+@@ -1644,9 +1644,9 @@ snmp_oid_ncompare(const oid*  in_name1,
+                   size_t len1,
+                   const oid*  in_name2, size_t len2, size_t max_len)
+ {
+-    register int    len;
+-    register const oid* name1 = in_name1;
+-    register const oid* name2 = in_name2;
++    int    len;
++    const oid* name1 = in_name1;
++    const oid* name2 = in_name2;
+     size_t          min_len;
+ 
+     /*
+diff --git a/interfaces/net-snmp/src/net-snmp/snmpusm_netsnmp.cpp b/interfaces/net-snmp/src/net-snmp/snmpusm_netsnmp.cpp
+index 267cec5..972ed4d 100644
+--- a/interfaces/net-snmp/src/net-snmp/snmpusm_netsnmp.cpp
++++ b/interfaces/net-snmp/src/net-snmp/snmpusm_netsnmp.cpp
+@@ -246,7 +246,7 @@ usm_set_usmStateReference_sec_level(struct usmStateReference* ref,
+ int
+ asn_predict_int_length(int type, long number, size_t len)
+ {
+-    register u_long mask;
++    u_long mask;
+ 
+ 
+     if (len != sizeof(long))
+diff --git a/interfaces/net-snmp/src/netSnmpAgent.cpp b/interfaces/net-snmp/src/netSnmpAgent.cpp
+index fd0824d..3412cff 100644
+--- a/interfaces/net-snmp/src/netSnmpAgent.cpp
++++ b/interfaces/net-snmp/src/netSnmpAgent.cpp
+@@ -215,7 +215,7 @@ NetSnmpAgent::AsnBuildHeaderWithTruth(unsigned char* data, int* datalength,
+  */
+ 
+ unsigned char*
+-NetSnmpAgent::AsnBuildObjId(register unsigned char* data, int* datalength,
++NetSnmpAgent::AsnBuildObjId(unsigned char* data, int* datalength,
+                             unsigned char type, oid* objid,int objidlength)
+ {
+ /*
+@@ -225,11 +225,11 @@ NetSnmpAgent::AsnBuildObjId(register unsigned char* data, int* datalength,
+  * lastbyte ::= 0 7bitvalue
+  */
+     unsigned char buf[MAX_OID_LEN];
+-    register unsigned char* bp = buf;
+-    register oid* op = objid;
++    unsigned char* bp = buf;
++    oid* op = objid;
+     int    asnlength;
+-    register unsigned long subid, mask, testmask;
+-    register int bits, testbits;
++    unsigned long subid, mask, testmask;
++    int bits, testbits;
+     if (objidlength < 2)
+     {
+         *bp++ = 0;
+@@ -305,7 +305,7 @@ NetSnmpAgent::AsnBuildObjId(register unsigned char* data, int* datalength,
+  */
+ 
+  unsigned char*
+-NetSnmpAgent::AsnBuildHeader(register unsigned char* data, int* datalength,
++NetSnmpAgent::AsnBuildHeader(unsigned char* data, int* datalength,
+                              unsigned char type, int length)
+ {
+     if (*datalength < 1)
+@@ -570,8 +570,8 @@ NetSnmpAgent::AsnBuildUnsignedInt(unsigned char*  data, int*  datalength,
+  * ASN.1 integer ::= 0x02 asnlength byte {byte}*
+  */
+ 
+-    register unsigned long integer;
+-    register unsigned long mask;
++    unsigned long integer;
++    unsigned long mask;
+     int add_null_byte = 0;
+ 
+     //if (intsize != sizeof (int))
+diff --git a/interfaces/net-snmp/src/netSnmpAgent.h b/interfaces/net-snmp/src/netSnmpAgent.h
+index 805dfa9..e930e55 100644
+--- a/interfaces/net-snmp/src/netSnmpAgent.h
++++ b/interfaces/net-snmp/src/netSnmpAgent.h
+@@ -2004,7 +2004,7 @@ public:
+                                      int* datalength,
+                                      unsigned char type,
+                                      int length);
+-    unsigned char* AsnBuildHeader(register unsigned char* data,
++    unsigned char* AsnBuildHeader(unsigned char* data,
+                                   int* datalength,
+     unsigned char type, int length);
+     unsigned char*  AsnBuildInt(unsigned char* data,
+@@ -2028,7 +2028,7 @@ public:
+                                    int* datalength,
+                                    unsigned char type,
+                                    char* string, int strlength);
+-    unsigned char* AsnBuildObjId(register unsigned char* data,
++    unsigned char* AsnBuildObjId(unsigned char* data,
+                                  int* datalength,
+                                  unsigned char type,
+                                  oid* objid,
+diff --git a/interfaces/pas/src/packet_analyzer.cpp b/interfaces/pas/src/packet_analyzer.cpp
+index 09dc9bf..4869448 100644
+--- a/interfaces/pas/src/packet_analyzer.cpp
++++ b/interfaces/pas/src/packet_analyzer.cpp
+@@ -117,11 +117,11 @@ static char temp[] = "0123456789abcdef";
+ #define    QM        0x22
+ 
+ #define    PRT_BUF_SZ    81
+-void hexprint( unsigned char nm, register unsigned char *inp, int len )
++void hexprint( unsigned char nm, unsigned char *inp, int len )
+ {
+-    register int i;
++    int i;
+     char    prt_buf[PRT_BUF_SZ];
+-    register char *ocharp;
++    char *ocharp;
+ 
+     if (len > 0) printf("\n");
+     while (len > 0) {
+diff --git a/libraries/CMakeLists.txt b/libraries/CMakeLists.txt
+index 7e45d7d..a011013 100644
+--- a/libraries/CMakeLists.txt
++++ b/libraries/CMakeLists.txt
+@@ -10,7 +10,8 @@ foreach (optional_lib
+     tirem
+     umts
+     underwater
+-    urban)
++    urban
++	user_models)
+   if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${optional_lib})
+     add_subdirectory(${optional_lib})
+   endif ()
+diff --git a/libraries/cyber/advanced/src/certificate_wtls.cpp b/libraries/cyber/advanced/src/certificate_wtls.cpp
+index 8a91ec3..4d852dd 100644
+--- a/libraries/cyber/advanced/src/certificate_wtls.cpp
++++ b/libraries/cyber/advanced/src/certificate_wtls.cpp
+@@ -156,10 +156,15 @@ HMAC_hash(sslbyte *res,
+           length_t data_leng,
+           SecurityParameters *sp)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    unsigned int i;
++    length_t step3_leng = B_LENG + data_leng, step6_leng;
++#else
+     register unsigned int i;
++    register length_t step3_leng = B_LENG + data_leng, step6_leng;
++#endif
+     sslbyte h_res[20];
+     length_t L = 0;
+-    register length_t step3_leng = B_LENG+data_leng, step6_leng;
+     sslbyte step1[B_LENG], *step2=(sslbyte *)xcalloc(step3_leng, 1), *step5;
+ 
+     if (K_leng > B_LENG)
+@@ -219,7 +224,11 @@ static void P_hash(sslbyte *res,
+ {
+     sslbyte *A=(sslbyte *)xcalloc(20+seed_leng, 1);
+     length_t L;
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t i, res_sz;
++#else
+     register length_t i, res_sz;
++#endif
+ 
+     /* compute A[1] at first */
+     HMAC_hash(A, &L, secret, secret_leng, seed, seed_leng, sp);
+@@ -263,7 +272,11 @@ void PRF(sslbyte *res,
+          length_t seed_leng,
+          SecurityParameters *sp)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t labelseed_leng = label_leng + seed_leng;
++#else
+     register length_t labelseed_leng = label_leng+seed_leng;
++#endif
+     sslbyte *labelseed = (sslbyte *)xcalloc(labelseed_leng, 1);
+ 
+     memcpy(labelseed, label, label_leng);
+@@ -446,10 +459,17 @@ void key_block(sslbyte *cw_mac, sslbyte *cw_key, sslbyte *cw_iv,
+ {
+     sslbyte seed[34];
+     uint16 seq_num = (sp->cur_seq/sp->refresh_seq)*(sp->refresh_seq);
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t macsz = sp->mac_key_size;
++    length_t keysz = sp->key_material_length;
++    length_t ivsz = sp->iv_size;
++    length_t keyblocksz = macsz + keysz + ivsz;
++#else
+     register length_t macsz = sp->mac_key_size;
+     register length_t keysz = sp->key_material_length;
+     register length_t ivsz = sp->iv_size;
+     register length_t keyblocksz = macsz + keysz + ivsz;
++#endif
+     sslbyte keyblock[40/*leng*/];  /* no cipher algorithm in WTLS needs > 40B */
+ 
+     memcpy(seed, &seq_num, sizeof(uint16));
+@@ -640,9 +660,7 @@ uint16_endian(sslbyte *in)
+ void
+ uint32_encode(sslbyte *result, uint32 in)
+ {
+-    register int i;
+-
+-    for (i=0; i<4; i++)
++    for (int i=0; i<4; i++)
+         result[i] = (sslbyte)(in >> (24-i*8));
+ }
+ uint32
+@@ -654,7 +672,11 @@ void
+ uint32_endian(sslbyte *in)
+ {
+     uint32 i;
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t j;
++#else
+     register length_t j;
++#endif
+ 
+     memcpy(&i, in, sizeof(uint32));
+ 
+@@ -666,9 +688,8 @@ uint32_endian(sslbyte *in)
+ void
+ uint64_encode(sslbyte *result, uint64 in)
+ {
+-    register int i;
+ 
+-    for (i=0; i<4; i++)
++    for (int i=0; i<4; i++)
+     {
+         result[i] = (sslbyte)(in[0] >> (24-i*8));
+         result[i+4] = (sslbyte)(in[1] >> (24-i*8));
+@@ -684,12 +705,11 @@ void
+ uint64_endian(sslbyte *in)
+ {
+     uint64 i;
+-    register length_t j;
+ 
+     memcpy(&i[0], in, sizeof(uint32));
+     memcpy(&i[1], in+sizeof(uint32), sizeof(uint32));
+ 
+-    for (j=0; j<4; j++)
++    for (length_t j=0; j<4; j++)
+     {
+         in[j] = (sslbyte)(i[0] >> (24-j*8));
+         in[j+4] = (sslbyte)(i[1] >> (24-j*8));
+@@ -777,7 +797,11 @@ length_t WTLSText_encode(sslbyte *result,
+                        uint16 length,
+                        sslbyte *fragment)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t i = 0;
++#else
+     register length_t i=0;
++#endif
+     opaque record_type = (sslbyte)
+         ((content_type << 4) | ((flag?1:0)<<2) | ((seq_ind?1:0)<<1) | 0x1);
+ 
+diff --git a/libraries/cyber/advanced/src/crypto_certificate.cpp b/libraries/cyber/advanced/src/crypto_certificate.cpp
+index e2ccf1d..5b31a1f 100644
+--- a/libraries/cyber/advanced/src/crypto_certificate.cpp
++++ b/libraries/cyber/advanced/src/crypto_certificate.cpp
+@@ -805,7 +805,11 @@ length_t WTLSCertificate_encode(sslbyte *result,
+                               sslbyte *to_be_signed_cert,
+                               sslbyte *signature)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    length_t i = 0;
++#else
+     register length_t i=0;
++#endif
+     length_t sz;
+ 
+     memcpy(&sz, to_be_signed_cert, sizeof(length_t));
+diff --git a/libraries/cyber/core/src/crypto_lib.cpp b/libraries/cyber/core/src/crypto_lib.cpp
+index d7a15d6..a1b59d8 100644
+--- a/libraries/cyber/core/src/crypto_lib.cpp
++++ b/libraries/cyber/core/src/crypto_lib.cpp
+@@ -36,7 +36,11 @@
+  */
+ static unsigned char high_to_hex(unsigned char in)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    unsigned char ch = (in >> 4) & 0xf;
++#else
+     register unsigned char ch = (in>>4) & 0xf;
++#endif
+     if (ch > 9)
+         return ch - 10 + 'A';
+     else
+@@ -44,7 +48,11 @@ static unsigned char high_to_hex(unsigned char in)
+ }
+ static unsigned char low_to_hex(unsigned char in)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    unsigned char ch = in & 0xf;
++#else
+     register unsigned char ch = in & 0xf;
++#endif
+     if (ch > 9)
+         return ch - 10 + 'A';
+     else
+diff --git a/libraries/cyber/core/src/network_ipsec.h b/libraries/cyber/core/src/network_ipsec.h
+index 04c5c18..9a3375e 100644
+--- a/libraries/cyber/core/src/network_ipsec.h
++++ b/libraries/cyber/core/src/network_ipsec.h
+@@ -396,7 +396,7 @@ typedef struct struct_haipe_spec_str
+ 
+ /// Structure for rate for different encryption
+ /// and authorization algorithm
+-typedef struct
++struct IPsecProcessingRate
+ {
+     clocktype hmacMd5Rate = 0;
+     clocktype hmacMd596Rate = 0;
+@@ -404,7 +404,7 @@ typedef struct
+     clocktype hmacSha196Rate = 0;
+     clocktype desCbcRate = 0;
+     clocktype aesXcbcMac96Rate = 0;
+-} IPsecProcessingRate;
++} ;
+ 
+ 
+ struct AlgoDetails
+diff --git a/libraries/cyber/hostmodel/include/host_model_types.h b/libraries/cyber/hostmodel/include/host_model_types.h
+index 1e73b66..2785d72 100644
+--- a/libraries/cyber/hostmodel/include/host_model_types.h
++++ b/libraries/cyber/hostmodel/include/host_model_types.h
+@@ -100,7 +100,7 @@ public:
+     Int32 mask = 24;
+     HAddress()
+     {
+-        address.networkType == NETWORK_INVALID;
++        address.networkType = NETWORK_INVALID;
+         memset(&address.interfaceAddr, 0, sizeof(address.interfaceAddr));
+     }
+     HAddress(const Address& addr, Int32 mask = 24) : address(addr), mask(mask) { }
+diff --git a/libraries/developer/src/app_cbr.cpp b/libraries/developer/src/app_cbr.cpp
+index 2cb1e93..3ff5777 100644
+--- a/libraries/developer/src/app_cbr.cpp
++++ b/libraries/developer/src/app_cbr.cpp
+@@ -709,6 +709,24 @@ void AppCbrClientPrintStats(Node *node, AppDataCbrClient *clientPtr) {
+         clientPtr->sourcePort,
+         buf);
+ 
++    sprintf(buf, "Sender = %d", node->nodeId);
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Client",
++        ANY_DEST,
++        clientPtr->sourcePort,
++        buf);
++
++    sprintf(buf, "Receiver = %d", clientPtr->destNodeId);
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Client",
++        ANY_DEST,
++        clientPtr->sourcePort,
++        buf);
++
+ }
+ 
+ /*
+@@ -1052,6 +1070,11 @@ AppLayerCbrServer(Node *node, Message *msg)
+                 }
+                 serverPtr->seqNo = data.seqNo + 1;
+ 
++#ifdef USER_MODELS_LIB
++                clocktype delay = node->getNodeTime() - data.txTime;
++                serverPtr->latencies->push_back(delay);
++#endif // USER_MODELS_LIB
++
+                 msgStatus = APP_MSG_NEW;
+ #ifdef LTE_LIB
+ #ifdef LTE_LIB_LOG
+@@ -1084,6 +1107,12 @@ AppLayerCbrServer(Node *node, Message *msg)
+                 }
+             }
+ 
++#ifdef USER_MODELS_LIB
++            else {
++                serverPtr->outOfOrderDrops++;
++            }
++#endif
++
+             serverPtr->stats->AppReportStatsDbReceiveEvent(
+                 node,
+                 msg,
+@@ -1164,6 +1193,24 @@ AppCbrServerPrintStats(Node *node, AppDataCbrServer *serverPtr) {
+         serverPtr->sourcePort,
+         buf);
+ 
++    sprintf(buf, "Receiver = %d", node->nodeId);
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Server",
++        ANY_DEST,
++        serverPtr->sourcePort,
++        buf);
++
++    sprintf(buf, "Sender = %d", MAPPING_GetNodeIdFromInterfaceAddress(node, serverPtr->remoteAddr));
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Server",
++        ANY_DEST,
++        serverPtr->sourcePort,
++        buf);
++
+ 
+ #ifdef LTE_LIB
+ #ifdef LTE_LIB_LOG
+@@ -1178,6 +1225,80 @@ AppCbrServerPrintStats(Node *node, AppDataCbrServer *serverPtr) {
+ #endif
+ #endif
+ #endif
++
++#ifdef USER_MODELS_LIB
++    sprintf(buf, "Out-of-order drop messages = %u", serverPtr->outOfOrderDrops);
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Server",
++        ANY_DEST,
++        serverPtr->sourcePort,
++        buf);
++    sprintf(buf, "Average hop count = %f", serverPtr->stats->GetAverageHopCount().GetValue(node->getNodeTime()));
++    IO_PrintStat(
++        node,
++        "Application",
++        "CBR Server",
++        ANY_DEST,
++        serverPtr->sourcePort,
++        buf);
++
++    if (!serverPtr->latencies->empty()) {
++        const double sum = std::accumulate(serverPtr->latencies->begin(), serverPtr->latencies->end(), 0.0);
++        const double mean = sum / serverPtr->latencies->size();
++        std::vector<double> diff(serverPtr->latencies->size());
++        std::transform(serverPtr->latencies->begin(), serverPtr->latencies->end(), diff.begin(), [mean](const double x) { return x - mean; });
++        const double sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0);
++        const double stdev = std::sqrt(sq_sum / serverPtr->latencies->size());
++        std::sort(serverPtr->latencies->begin(), serverPtr->latencies->end());
++
++        sprintf(buf, "Average End-to-End delay (sd second) = %f", stdev / SECOND);
++        IO_PrintStat(
++            node,
++            "Application",
++            "CBR Server",
++            ANY_DEST,
++            serverPtr->sourcePort,
++            buf);
++
++        sprintf(buf, "Average End-to-End delay (median second) = %f", static_cast<double>(serverPtr->latencies->at(static_cast<size_t>(serverPtr->latencies->size() / 2))) / SECOND);
++        IO_PrintStat(
++            node,
++            "Application",
++            "CBR Server",
++            ANY_DEST,
++            serverPtr->sourcePort,
++            buf);
++
++        sprintf(buf, "Average End-to-End delay (95th second) = %f", static_cast<double>(serverPtr->latencies->at(static_cast<size_t>(serverPtr->latencies->size() * 0.95))) / SECOND);
++        IO_PrintStat(
++            node,
++            "Application",
++            "CBR Server",
++            ANY_DEST,
++            serverPtr->sourcePort,
++            buf);
++
++        sprintf(buf, "Average End-to-End delay (best second) = %f", static_cast<double>(serverPtr->latencies->front()) / SECOND);
++        IO_PrintStat(
++            node,
++            "Application",
++            "CBR Server",
++            ANY_DEST,
++            serverPtr->sourcePort,
++            buf);
++
++        sprintf(buf, "Average End-to-End delay (worst second) = %f", static_cast<double>(serverPtr->latencies->back()) / SECOND);
++        IO_PrintStat(
++            node,
++            "Application",
++            "CBR Server",
++            ANY_DEST,
++            serverPtr->sourcePort,
++            buf);
++    }
++#endif
+ }
+ 
+ /*
+@@ -1279,7 +1400,10 @@ AppCbrServerNewCbrServer(Node *node,
+     //    cbrServer->lastPacketReceptionTime = 0;
+     cbrServer->stats = NULL;
+ 
+-
++#ifdef USER_MODELS_LIB
++    cbrServer->outOfOrderDrops = 0;
++    cbrServer->latencies = std::make_unique<std::vector<clocktype>>();
++#endif // USER_MODELS_LIB
+ 
+     APP_RegisterNewApp(node, APP_CBR_SERVER, cbrServer);
+ 
+diff --git a/libraries/developer/src/app_cbr.h b/libraries/developer/src/app_cbr.h
+index 3e9ee89..c804779 100644
+--- a/libraries/developer/src/app_cbr.h
++++ b/libraries/developer/src/app_cbr.h
+@@ -23,6 +23,11 @@
+ #include "stats_app.h"
+ #include "application.h"
+ 
++#ifdef USER_MODELS_LIB
++#include <memory>
++#include <vector>
++#endif
++
+ /*
+  * Header size defined to be consistent accross 32/64 bit platforms
+  */
+@@ -101,6 +106,11 @@ struct struct_app_cbr_server_str
+   //    clocktype lastPacketReceptionTime;
+ 
+     STAT_AppStatsDataCollection* stats;
++
++#ifdef USER_MODELS_LIB
++    unsigned int outOfOrderDrops;
++    std::unique_ptr<std::vector<clocktype>> latencies;
++#endif
+ }
+ AppDataCbrServer;
+ 
+diff --git a/libraries/developer/src/app_mdp.cpp b/libraries/developer/src/app_mdp.cpp
+index ae79f9c..13d6415 100644
+--- a/libraries/developer/src/app_mdp.cpp
++++ b/libraries/developer/src/app_mdp.cpp
+@@ -4340,7 +4340,11 @@ BOOL MdpIsServerPacket(Node* node, Message* theMsg)
+ void MdpSwapIncomingPacketForNtoh(Node* node, Message* theMsg)
+ {
+     MdpMessage msg;
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    UInt32 len = 0;
++#else
+     register UInt32 len = 0;
++#endif
+     Int32 count = 0;
+     unsigned char* buffer = (unsigned char*)MESSAGE_ReturnPacket(theMsg);
+     Int32 size = theMsg->packetSize;
+diff --git a/libraries/developer/src/mac_link.cpp b/libraries/developer/src/mac_link.cpp
+index 5170d54..390d952 100644
+--- a/libraries/developer/src/mac_link.cpp
++++ b/libraries/developer/src/mac_link.cpp
+@@ -891,7 +891,7 @@ void ReturnLinkParameters(
+                     addStr);
+             ERROR_ReportError(errorStr);
+         }
+-        else if (bandwidth < 0)
++        else if (*bandwidth < 0)
+         {
+             char errorStr[MAX_STRING_LENGTH];
+             sprintf(errorStr, "LINK-BANDWIDTH for %s needs to be >= 0.\n",
+diff --git a/libraries/developer/src/mac_multicast.h b/libraries/developer/src/mac_multicast.h
+index 634e224..81e685a 100644
+--- a/libraries/developer/src/mac_multicast.h
++++ b/libraries/developer/src/mac_multicast.h
+@@ -20,7 +20,7 @@
+ //
+ 
+ #ifndef MAC_MULTICAST_H
+-#define MAC_MUTICAST_H
++#define MAC_MULTICAST_H
+ 
+ #include "address.h"
+ #include "node.h"
+diff --git a/libraries/developer/src/mdp/mdpEncoder.cpp b/libraries/developer/src/mdp/mdpEncoder.cpp
+index 208e194..323d142 100644
+--- a/libraries/developer/src/mdp/mdpEncoder.cpp
++++ b/libraries/developer/src/mdp/mdpEncoder.cpp
+@@ -388,11 +388,19 @@ void MdpDecoder::Destroy()
+ // This will crash & burn if (NErasures > npar)
+ int MdpDecoder::Decode(char** dVec, int ndata, const char* ErasureMask)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    unsigned char* S, * Omega, * data;
++#else
+     register unsigned char *S, *Omega, *data;
++#endif
+     int i, j, k, n;
+     int X, denom, Lk;
+     int degree = 2*npar;
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int nvecs = npar + ndata;
++#else
+     register int nvecs = npar + ndata;
++#endif
+     int nvecs_minus_one = nvecs - 1;
+     int vecSize = vector_size;
+ 
+diff --git a/libraries/developer/src/mdp/mdpMessage.cpp b/libraries/developer/src/mdp/mdpMessage.cpp
+index 507edbc..cb0b8b5 100644
+--- a/libraries/developer/src/mdp/mdpMessage.cpp
++++ b/libraries/developer/src/mdp/mdpMessage.cpp
+@@ -98,10 +98,15 @@ static void MdpUnpackFileNameInfo(MdpMessage* msg)
+ 
+ int MdpMessage::Pack(char *buffer)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    UInt32 len = 0;
++    UInt32 temp_long;
++    unsigned short temp_short;
++#else
+     register UInt32 len = 0;
+     register UInt32 temp_long;
+     register unsigned short temp_short;
+-
++#endif
+     // If these assertions fail, the code base needs some reworking
+     // for compiler with different size settings (or set compiler
+     // settings so these values work)
+@@ -389,8 +394,13 @@ int MdpMessage::Pack(char *buffer)
+ bool MdpMessage::Unpack(char *buffer, int packet_length,
+                         int virtual_length, bool* isServerPacket)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    UInt32 len = 0;
++    UInt32 temp_long;
++#else
+     register UInt32 len = 0;
+     register UInt32 temp_long;
++#endif
+     // Unpack common fields first.
+     type = (unsigned char) buffer[len++];
+     version = (unsigned char) buffer[len++];
+@@ -824,7 +834,11 @@ int MdpObjectNack::Pack()
+ 
+ int MdpObjectNack::Unpack(char *buffer)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int len = 0;
++#else
+     register int len = 0;
++#endif
+     memcpy(&object_id, buffer, sizeof(UInt32));
+     len += sizeof(UInt32);
+     memcpy(&nack_len, &buffer[len], sizeof(short));
+@@ -837,7 +851,11 @@ int MdpObjectNack::Unpack(char *buffer)
+ 
+ int MdpRepairNack::Pack(char* buffer, unsigned int buflen)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int len = 0;
++#else
+     register int len = 0;
++#endif
+     if (buflen-- > 0)
+         buffer[len++] = (char)type;
+     else
+@@ -908,7 +926,11 @@ int MdpRepairNack::Pack(char* buffer, unsigned int buflen)
+ 
+ int MdpRepairNack::Unpack(char* buffer)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int len = 0;
++#else
+     register int len = 0;
++#endif
+     type = (MdpRepairType) buffer[len++];
+     switch (type)
+     {
+diff --git a/libraries/developer/src/network_ip.cpp b/libraries/developer/src/network_ip.cpp
+index 53e8e3e..249a7f7 100644
+--- a/libraries/developer/src/network_ip.cpp
++++ b/libraries/developer/src/network_ip.cpp
+@@ -10587,6 +10587,14 @@ NetworkRoutingGetAdminDistance(
+         {
+             return ROUTING_ADMIN_DISTANCE_FSRL;
+         }
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++        case ROUTING_PROTOCOL_QROUTING:
++        {
++            return ROUTING_ADMIN_DISTANCE_QROUTING;
++        }
++#endif
++#endif
+         default:
+             ERROR_ReportError("Invalid switch value");
+             return (NetworkRoutingAdminDistanceType) 0;  // Not reachable.
+@@ -20030,6 +20038,14 @@ void NetworkIpParseAndSetRoutingProtocolType(
+                     // Allow a node to specify explicitly that routing
+                     // protocols are not used.
+                 }
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++                else if (strcmp(protocolString, "QROUTING") == 0)
++                {
++                    routingProtocolType = ROUTING_PROTOCOL_QROUTING;
++                }
++#endif
++#endif
+                 else
+                 {
+                     char buff[MAX_STRING_LENGTH];
+diff --git a/libraries/developer/src/tcp/app_echo.cpp b/libraries/developer/src/tcp/app_echo.cpp
+index 68b8d2d..959e281 100644
+--- a/libraries/developer/src/tcp/app_echo.cpp
++++ b/libraries/developer/src/tcp/app_echo.cpp
+@@ -262,7 +262,7 @@ void AppLayerEcho(Node* node, Message* msg)
+         {
+             node->appData.numAppTcpFailure ++;
+         }
+-        else if (openResult->type == TCP_CONN_ACTIVE_OPEN);
++        else if (openResult->type == TCP_CONN_ACTIVE_OPEN)//;
+         {
+             struct echo_session* session;
+             session = get_session(node, openResult->uniqueId, openResult->connectionId);
+diff --git a/libraries/developer/src/tcp/transport_tcp_hdr.h b/libraries/developer/src/tcp/transport_tcp_hdr.h
+index d1b9cd7..6643f9b 100644
+--- a/libraries/developer/src/tcp/transport_tcp_hdr.h
++++ b/libraries/developer/src/tcp/transport_tcp_hdr.h
+@@ -125,9 +125,9 @@ public:
+     BitFieldView(U& con, int st, int numbits) : m_container(con), m_start(st+1), m_end(st+numbits) {}
+     operator U() const { return Rshift<U>(mask<U>(m_start, m_end) & m_container, m_end); }
+     BitFieldView& operator =(U val) {
+-        U mask(mask<U>(m_start, m_end));
+-        m_container &= ~mask;
+-        m_container |= Lshift<U>(val, m_end) & mask;
++        U my_mask(mask<U>(m_start, m_end));
++        m_container &= ~my_mask;
++        m_container |= Lshift<U>(val, m_end) & my_mask;
+         return *this;
+     }
+ 
+diff --git a/libraries/umts/src/cellular_umts.h b/libraries/umts/src/cellular_umts.h
+index 8051c9f..24615d4 100644
+--- a/libraries/umts/src/cellular_umts.h
++++ b/libraries/umts/src/cellular_umts.h
+@@ -29,6 +29,7 @@
+ #include <list>
+ #include <bitset>
+ #include <algorithm>
++#include <functional>
+ 
+ #include "message.h"
+ #include "trace.h"
+@@ -2090,8 +2091,8 @@ public:
+ /// set that store pointers to the real objects.
+ /// Note class T must implement operator<
+ template<class T>
+-class UmtsPointedItemLess : 
+-    public std::binary_function<const T*, const T*, bool>
++class UmtsPointedItemLess :
++    public std::function<bool(const T*, const T*)>
+ {
+ public:
+     bool operator() (const T* lPtr,
+@@ -2106,7 +2107,7 @@ public:
+ /// by pointers
+ template<class T>
+ class UmtsPointedItemEqual : 
+-    public std::binary_function<const T*, const T*, bool>
++    public std::function<bool(const T*, const T*)>
+ {
+ public:
+     bool operator() (const T* lPtr,
+diff --git a/libraries/umts/src/layer2_umts_mac.h b/libraries/umts/src/layer2_umts_mac.h
+index 76a44e3..83b8ef7 100644
+--- a/libraries/umts/src/layer2_umts_mac.h
++++ b/libraries/umts/src/layer2_umts_mac.h
+@@ -123,7 +123,7 @@ struct UmtsLogChInfoPtrLess {
+ #ifdef _WIN64
+ template<>
+ struct std::greater<UmtsLogChInfo*>  : 
+-    public binary_function<UmtsLogChInfo* ,UmtsLogChInfo*, bool>
++    public std::function<bool(UmtsLogChInfo* ,UmtsLogChInfo*)>
+ {
+     bool operator()(const UmtsLogChInfo* x, const UmtsLogChInfo* y) const
+     {
+@@ -256,7 +256,7 @@ struct UmtsTransChInfoPtrLess {
+ #ifdef _WIN64
+ template<>
+ struct std::greater<UmtsTransChInfo*>  :
+-    public binary_function<UmtsTransChInfo* ,UmtsTransChInfo*, bool>
++    public std::function<bool(UmtsTransChInfo* ,UmtsTransChInfo*)>
+ {
+     bool operator()(const UmtsTransChInfo* x, const UmtsTransChInfo* y) const
+     {
+diff --git a/libraries/umts/src/layer3_umts_gsn.cpp b/libraries/umts/src/layer3_umts_gsn.cpp
+index 2e9b13d..896c94a 100644
+--- a/libraries/umts/src/layer3_umts_gsn.cpp
++++ b/libraries/umts/src/layer3_umts_gsn.cpp
+@@ -4077,7 +4077,7 @@ BOOL UmtsLayer3GsnReqMmConnEst(
+         if (ueMm->actMmConns->end() ==
+                 find_if(ueMm->actMmConns->begin(),
+                         ueMm->actMmConns->end(),
+-                        bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                        std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                 &cmpMmConn)))
+         {
+             ueMm->actMmConns->push_back(new UmtsLayer3MmConn(cmpMmConn));
+@@ -4112,7 +4112,7 @@ void UmtsLayer3GsnReleaseMmConn(
+     UmtsMmConnCont::iterator mmConnIter =
+             find_if(ueMm->actMmConns->begin(),
+                     ueMm->actMmConns->end(),
+-                    bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                    std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                             &cmpMmConn));
+     if (ueMm->actMmConns->end() != mmConnIter)
+     {
+@@ -8924,7 +8924,7 @@ void UmtsLayer3GsnHandleNasMsg(
+         if (ueMm->actMmConns->end() ==
+                 find_if(ueMm->actMmConns->begin(),
+                         ueMm->actMmConns->end(),
+-                        bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                        std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                 &cmpMmConn)))
+         {
+             ueMm->actMmConns->push_back(new UmtsLayer3MmConn(cmpMmConn));
+@@ -12901,8 +12901,8 @@ void UmtsLayer3GsnMmConnEstInd(
+                 if (ueMm->actMmConns->end() ==
+                         find_if(ueMm->actMmConns->begin(),
+                                 ueMm->actMmConns->end(),
+-                                bind2nd(
+-                                  UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                                std::bind(
++                                  UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                         &cmpMmConn)))
+                 {
+                     ueMm->actMmConns->
+diff --git a/libraries/umts/src/layer3_umts_rnc.h b/libraries/umts/src/layer3_umts_rnc.h
+index 88d0bbe..ab77bfd 100644
+--- a/libraries/umts/src/layer3_umts_rnc.h
++++ b/libraries/umts/src/layer3_umts_rnc.h
+@@ -113,7 +113,7 @@ struct UmtsMntNodebInfo
+ #ifdef _WIN64
+ template<>
+ struct std::greater<UmtsMntNodebInfo*>  : 
+-    public binary_function<UmtsMntNodebInfo* ,UmtsMntNodebInfo*, bool>
++    public std::function<bool(UmtsMntNodebInfo* ,UmtsMntNodebInfo*)>
+ {
+     bool operator()(const UmtsMntNodebInfo* x, 
+                     const UmtsMntNodebInfo* y) const
+@@ -516,8 +516,8 @@ typedef std::list<UmtsRncRabAssgtReqInfo*> UmtsRabAssgtReqList;
+ #ifdef _WIN64
+ template<>
+ struct std::greater<UmtsRncRabAssgtReqInfo*>  : 
+-            public binary_function<UmtsRncRabAssgtReqInfo* ,
+-                                   UmtsRncRabAssgtReqInfo*, bool>
++    public std::function<bool(UmtsRncRabAssgtReqInfo* ,
++                                   UmtsRncRabAssgtReqInfo*)>
+ {
+     bool operator()(const UmtsRncRabAssgtReqInfo* lPtr, 
+                     const UmtsRncRabAssgtReqInfo* rPtr) const
+diff --git a/libraries/umts/src/layer3_umts_ue.cpp b/libraries/umts/src/layer3_umts_ue.cpp
+index ed2d419..e336e76 100644
+--- a/libraries/umts/src/layer3_umts_ue.cpp
++++ b/libraries/umts/src/layer3_umts_ue.cpp
+@@ -4364,7 +4364,7 @@ BOOL UmtsLayer3UeReqMmConnEst(
+         if (ueMm->rqtingMmConns->end() ==
+                 find_if (ueMm->rqtingMmConns->begin(),
+                         ueMm->rqtingMmConns->end(),
+-                        bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                        std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                 &cmpMmConn)))
+         {
+             ueMm->rqtingMmConns->push_back(new UmtsLayer3MmConn(cmpMmConn));
+@@ -4384,7 +4384,7 @@ BOOL UmtsLayer3UeReqMmConnEst(
+             if (ueMm->actMmConns->end() !=
+                     find_if (ueMm->actMmConns->begin(),
+                             ueMm->actMmConns->end(),
+-                           bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                           std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                     &cmpMmConn)))
+             {
+                 retVal = TRUE;
+@@ -4492,7 +4492,7 @@ void UmtsLayer3UeReleaseMmConn(
+     UmtsMmConnCont::iterator mmConnIter =
+             find_if (ueMm->actMmConns->begin(),
+                     ueMm->actMmConns->end(),
+-                    bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                    std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                             &cmpMmConn));
+     if (ueMm->actMmConns->end() != mmConnIter)
+     {
+@@ -11798,7 +11798,7 @@ void UmtsLayer3UeHandleNasMsg(Node* node,
+         if (ueMm->actMmConns->end() ==
+                 find_if(ueMm->actMmConns->begin(),
+                         ueMm->actMmConns->end(),
+-                        bind2nd(UmtsPointedItemEqual<UmtsLayer3MmConn>(),
++                        std::bind(UmtsPointedItemEqual<UmtsLayer3MmConn>(), placeholders::_1,
+                                 &cmpMmConn)))
+         {
+             ueMm->actMmConns->push_back(new UmtsLayer3MmConn(cmpMmConn));
+diff --git a/main/application.cpp b/main/application.cpp
+index 23c0a3a..b92887c 100644
+--- a/main/application.cpp
++++ b/main/application.cpp
+@@ -213,6 +213,18 @@ using Qualnet::AppModel;
+ #include "cyber_state.h"
+ #endif
+ 
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++#include "routing_qrouting.h"
++#endif
++#ifdef UNFIXED_COMMS
++#include "app_unfixed_comms.h"
++#endif
++#ifdef MP_OLSR
++#include "routing_mpolsrv2_niigata.h"
++#endif
++#endif
++
+ #include "mac_switch.h"
+ 
+ // Dynamic info to provide hop-by-hop flow info data
+@@ -1322,6 +1334,40 @@ APP_Initialize(Node *node, const NodeInput *nodeInput)
+ #endif // WIRELESS_LIB
+                 //InsertPatch APP_ROUTING_INIT_CODE
+ 
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++                case ROUTING_PROTOCOL_QROUTING:
++                {
++                    if (node->appData.qrouting == NULL)
++                    {
++                        RoutingQroutingInit(node);
++                        RoutingQroutingInitTrace(node, nodeInput);
++                    }
++                    break;
++                }
++#endif
++#ifdef MP_OLSR
++                case ROUTING_PROTOCOL_MPOLSRv2_NIIGATA:
++                {
++                    if (node->appData.olsrv2 == NULL)
++                    {
++                        RoutingMPOLSRv2_Niigata_Init(node,
++                            nodeInput,
++                            i,
++                            NETWORK_IPV4);
++                    }
++                    else
++                    {
++                        RoutingMPOLSRv2_Niigata_AddInterface(node,
++                            nodeInput,
++                            i,
++                            NETWORK_IPV4);
++                    }
++                    break;
++                }
++#endif
++#endif
++
+                 default:
+                 {
+                     break;
+@@ -2174,6 +2220,11 @@ APP_InitializeApplications(
+                     && strcmp(appStr, "MCBR") !=0
+                     && strcmp(appStr, "TRAFFIC-GEN") !=0
+                     && strcmp(appStr, "JAMMER") !=0
++#ifdef USER_MODELS_LIB
++#ifdef UNFIXED_COMMS
++                    && strcmp(appStr, "UNFIXED-COMMS") != 0
++#endif
++#endif
+                     && !modelIp6)
+                 {
+                     ERROR_ReportErrorArgs(
+@@ -6827,6 +6878,59 @@ APP_InitializeApplications(
+                 ERROR_ReportMissingLibrary(appStr, "SENSOR_NETWORKS");
+ #endif //SENSOR_NETWORKS_LIB
+             }
++#ifdef USER_MODELS_LIB
++#ifdef UNFIXED_COMMS
++            else if (strcmp(appStr, "UNFIXED-COMMS") == 0) {
++                int interface = -1;
++                char startTimeStr[MAX_STRING_LENGTH];
++                char endTimeStr[MAX_STRING_LENGTH];
++                float drop = 0.0;
++                char sourceString[MAX_STRING_LENGTH];
++                NodeAddress sourceNodeId = -2;
++                Address sourceAddr;
++                char delayStr[MAX_STRING_LENGTH];
++
++                //std::cout << "Input string: " << appInput.inputStrings[i] << std::endl;
++
++                numValues = sscanf(appInput.inputStrings[i],
++                    "%*s %s %i %f %s %s %s",
++                    sourceString,
++                    &interface,
++                    &drop,
++                    delayStr,
++                    startTimeStr,
++                    endTimeStr);
++
++                if (numValues != 6)
++                {
++                    char errorString[MAX_STRING_LENGTH];
++                    sprintf(errorString,
++                        "Wrong unfixed-comms configuration format!\n"
++                        "UNFIXED-COMMS <node> <interface> <drop> <delay> <start time> <stop time>\n");
++                    ERROR_ReportError(errorString);
++                }
++
++                clocktype startTime = TIME_ConvertToClock(startTimeStr);
++                clocktype endTime = TIME_ConvertToClock(endTimeStr);
++                clocktype delay = TIME_ConvertToClock(delayStr);
++
++                //std::cout << "Parsed values: " << sourceString << ";" << interface << ";" << drop << ";" << delayStr << std::endl;
++
++                IO_AppParseSourceString(
++                    firstNode,
++                    appInput.inputStrings[i],
++                    sourceString,
++                    &sourceNodeId,
++                    &sourceAddr);
++
++                node = MAPPING_GetNodePtrFromHash(nodeHash, sourceNodeId);
++                if (node != NULL)
++                {
++                    AppUnfixedCommsInit(node, startTime, endTime, delay, drop, interface);
++                }
++            }
++#endif
++#endif
+             else
+             {
+                 std::string errorString;
+@@ -7393,6 +7497,35 @@ void APP_ProcessEvent(Node *node, Message *msg)
+         }
+ //InsertPatch LAYER_FUNCTION
+ 
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++        case APP_ROUTING_QROUTING:
++        {
++            RoutingQroutingLayer(node, msg);
++            break;
++        }
++#endif
++#ifdef MP_OLSR
++        case APP_ROUTING_MPOLSRv2_NIIGATA:
++        {
++            if (ip->interfaceInfo[0]->routingProtocolType == ROUTING_PROTOCOL_OLSRv2_NIIGATA) {
++                RoutingOLSRv2_Niigata_Layer(node, msg);
++            }
++            else if (ip->interfaceInfo[0]->routingProtocolType == ROUTING_PROTOCOL_MPOLSRv2_NIIGATA) {
++                RoutingMPOLSRv2_Niigata_Layer(node, msg);
++            }
++            break;
++        }
++#endif
++#ifdef UNFIXED_COMMS
++        case APP_UNFIXED_COMMS:
++        {
++            AppUnfixedCommsLayer(node, msg);
++            break;
++        }
++#endif
++#endif
++
+ #ifdef LTE_LIB
+         case APP_EPC_LTE:
+         {
+@@ -7780,6 +7913,23 @@ APP_Finalize(Node *node)
+     //EndRIP
+     //InsertPatch FINALIZE_ROUTING_FUNCTION
+ 
++#ifdef USER_MODELS_LIB
++#ifdef QROUTING
++                case ROUTING_PROTOCOL_QROUTING:
++                {
++                    RoutingQroutingFinalize(node, i);
++                    break;
++                }
++#endif
++#ifdef MP_OLSR
++                case ROUTING_PROTOCOL_MPOLSRv2_NIIGATA:
++                {
++                    RoutingMPOLSRv2_Niigata_Finalize(node, i);
++                    break;
++                }
++#endif
++#endif
++
+                 default:
+                     break;
+             }//switch//
+@@ -7819,6 +7969,16 @@ APP_Finalize(Node *node)
+                 }
+     //EndRIPng
+     //InsertPatch FINALIZE_ROUTING_FUNCTION
++
++#ifdef USER_MODELS_LIB
++#ifdef MP_OLSR
++                case ROUTING_PROTOCOL_MPOLSRv2_NIIGATA:
++                {
++                    RoutingMPOLSRv2_Niigata_Finalize(node, i);
++                    break;
++                }
++#endif
++#endif
+                 default:
+                     break;
+             }//switch//
+@@ -8258,6 +8418,17 @@ APP_Finalize(Node *node)
+                 break;
+             }
+ //InsertPatch FINALIZE_FUNCTION
++
++#ifdef USER_MODELS_LIB
++#ifdef UNFIXED_COMMS
++            case APP_UNFIXED_COMMS:
++            {
++                AppUnfixedCommsFinalize(node);
++                break;
++            }
++#endif
++#endif
++
+             default:
+ #ifndef EXATA
+                 ERROR_ReportError("Unknown or disabled application");
+diff --git a/main/sliding_win.cpp b/main/sliding_win.cpp
+index 0a26d87..1619dc5 100644
+--- a/main/sliding_win.cpp
++++ b/main/sliding_win.cpp
+@@ -53,7 +53,11 @@ void MsTmWinClear(MsTmWin* pWin)
+ void MsTmWinReset(MsTmWin* pWin, clocktype sSize, int nSlot, double weight,
+                   clocktype theTime)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int idx;
++#else
+     register int    idx;
++#endif
+     clocktype       time = theTime;
+ 
+     MsTmWinClear(pWin);
+@@ -71,7 +75,11 @@ void MsTmWinReset(MsTmWin* pWin, clocktype sSize, int nSlot, double weight,
+ 
+ void MsTmWinNewData(MsTmWin* pWin, double data, clocktype theTime)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int tmp;
++#else
+     register int    tmp;
++#endif
+     int             idx;
+     int             shift;
+     clocktype       time = theTime;
+@@ -97,7 +105,11 @@ void MsTmWinNewData(MsTmWin* pWin, double data, clocktype theTime)
+ 
+ clocktype MsTmWinWinSize(MsTmWin* pWin, clocktype theTime)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int idx;
++#else
+     register int    idx;
++#endif
+     clocktype       time = theTime;
+ 
+     // check the current time
+@@ -114,7 +126,11 @@ clocktype MsTmWinWinSize(MsTmWin* pWin, clocktype theTime)
+ 
+ double MsTmWinSum(MsTmWin* pWin, clocktype theTime)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int tmp;
++#else
+     register int    tmp;
++#endif
+     int             idx;
+     double          sum;
+     int             shift;
+@@ -134,7 +150,11 @@ double MsTmWinSum(MsTmWin* pWin, clocktype theTime)
+ 
+ double MsTmWinAvg(MsTmWin* pWin, clocktype theTime)
+ {
++#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
++    int tmp;
++#else
+     register int    tmp;
++#endif
+     int             idx;
+     double          avg;
+     double          weight;
diff --git a/patch_qualnet_8.2_to_9.2.patch b/patch_qualnet_8.2_to_9.2.patch
index 651942933137b5398debd64210bee53ab51f70d7..c3c01a5a45211c06adf42c2c4ae1ef7b301405d1 100644
--- a/patch_qualnet_8.2_to_9.2.patch
+++ b/patch_qualnet_8.2_to_9.2.patch
@@ -1,24 +1,7 @@
 diff --git a/libraries/user_models/src/routing_qrouting.cpp b/libraries/user_models/src/routing_qrouting.cpp
 index 5fbbf3e..ac18f4b 100644
 --- a/libraries/user_models/src/routing_qrouting.cpp
-+++ b/libraries_user_models_qrouting_src_routing_qrouting.cpp
-@@ -30,6 +30,16 @@ As Qualnet uses events and messages, we reuse Bellman-Ford messages.
- #include "aux_data_extractor.hpp"	// data extractor
- #include <future>
- #endif
-+
-+void QroutingHookToRedistribute(
-+	Node* node,
-+	NodeAddress destAddress,
-+	NodeAddress destAddressMask,
-+	NodeAddress nextHopAddress,
-+	int interfaceIndex,
-+	void* routeCost,
-+	unsigned short receiverAsId);
-+
- namespace qrouting {
- 	//#define DEBUG_QTABLE
- #define nDEBUG
++++ b/libraries/user_models/src/routing_qrouting.cpp
 @@ -1442,7 +1452,8 @@ void QroutingHookToRedistribute(
  	NodeAddress destAddressMask,
  	NodeAddress nextHopAddress,
@@ -29,3 +12,18 @@ index 5fbbf3e..ac18f4b 100644
  {
  	using namespace qrouting;
  	int cost = *(int*)routeCost;
+
+diff --git a/libraries/user_models/src/routing_qrouting.h b/libraries/user_models/src/routing_qrouting.h
+index 4169034..f1047c7 100644
+--- a/libraries/user_models/src/routing_qrouting.h
++++ b/libraries/user_models/src/routing_qrouting.h
+@@ -74,7 +74,8 @@ void QroutingHookToRedistribute(
+ 	NodeAddress destAddressMask,
+ 	NodeAddress nextHopAddress,
+ 	int interfaceIndex,
+-	void* routeCost);
++	void* routeCost,
++	unsigned short receiverAsId);
+ 
+ //
+ // FUNCTION   :: RoutingQroutingPrintTraceXML