diff --git a/ble/.cproject b/ble/.cproject
new file mode 100644
index 0000000000000000000000000000000000000000..620b8679aa500cb6e6ecdbd596813adca48d49cd
--- /dev/null
+++ b/ble/.cproject
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" name="Debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962">
+					<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962." name="/" resourcePath="">
+						<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.548125692" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.1448195934" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.989348626" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.573934961" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.1195068176" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.1035348629" name="Data sections (-fdata-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections" value="true" valueType="boolean"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.31679983" name="Debug level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.max" valueType="enumerated"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.1676901946" name="Debug format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.1729767352" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name" value="GNU Tools for ARM Embedded Processors" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.1708484008" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture" value="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.arm" valueType="enumerated"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.178519983" name="ARM family" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.mcpu.cortex-m3" valueType="enumerated"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.956545422" name="Instruction set" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.thumb" valueType="enumerated"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.1580514969" name="Prefix" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix" value="arm-none-eabi-" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1246670973" name="C compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.c" value="gcc" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.1674926322" name="C++ compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp" value="g++" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.2051566192" name="Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar" value="ar" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.408066731" name="Hex/Bin converter" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy" value="objcopy" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.1900584936" name="Listing generator" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump" value="objdump" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.1096852527" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size" value="size" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.937347953" name="Build command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" value="make" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.1468247042" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm" value="rm" valueType="string"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.1529750846" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash" value="true" valueType="boolean"/>
+							<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.667765305" name="Print size" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize" value="true" valueType="boolean"/>
+							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.786533016" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
+							<builder arguments="-r ECLIPSE=1" buildPath="${workspace_loc:/BLE_fit}" command="make" id="ilg.gnuarmeclipse.managedbuild.cross.builder.592880777" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1648672385" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1969112665" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
+								<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input.507854261" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input"/>
+							</tool>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1576427906" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler">
+									<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths.1576427906" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/Libraries/CMSIS/Device/Maxim/MAX32665/Include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/Libraries/MAX32665PeriphDriver/Include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/Libraries/Boards/EvKit_V1/Include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/Libraries/Boards/Include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/Libraries/CMSIS/Include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Toolchain/arm-none-eabi/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Toolchain/arm-none-eabi/include/sys&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Toolchain/lib/gcc/arm-none-eabi/6.3.1/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/wsf/common/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/wsf/common/include/util&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/platform/common/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/controller/sources/mac/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-host/include&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-profiles/include/app&quot;"/>
+										<listOptionValue builtIn="false" value="&quot;${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-profiles/sources/profiles/include&quot;"/>
+									</option>
+								<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.68945223" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
+							</tool>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.794996645" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler"/>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.675776866" name="Cross ARM C Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker">
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections.185399645" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections" value="true" valueType="boolean"/>
+								<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input.246156916" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.391142733" name="Cross ARM C++ Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker">
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections.2099090970" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
+							</tool>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.399743328" name="Cross ARM GNU Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver"/>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.822983655" name="Cross ARM GNU Create Flash Image" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash"/>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.1050446219" name="Cross ARM GNU Create Listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting">
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source.335976671" name="Display source (--source|-S)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source" value="true" valueType="boolean"/>
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders.964898349" name="Display all headers (--all-headers|-x)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders" value="true" valueType="boolean"/>
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle.972868647" name="Demangle names (--demangle|-C)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle" value="true" valueType="boolean"/>
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers.890608562" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers" value="true" valueType="boolean"/>
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide.1669392057" name="Wide lines (--wide|-w)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide" value="true" valueType="boolean"/>
+							</tool>
+							<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.403251962" name="Cross ARM GNU Print Size" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize">
+								<option id="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format.1919947275" name="Size format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="BLE_fit.ilg.gnuarmeclipse.managedbuild.cross.target.elf.737306620" name="Executable" projectType="ilg.gnuarmeclipse.managedbuild.cross.target.elf"/>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1576427906;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.68945223">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+	<storageModule moduleId="refreshScope" versionNumber="2">
+		<configuration configurationName="Debug">
+			<resource resourceType="PROJECT" workspacePath="/BLE_fit"/>
+		</configuration>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>
diff --git a/ble/.gdbinit b/ble/.gdbinit
new file mode 100644
index 0000000000000000000000000000000000000000..85b92cf79c0f29f412a886e093c13da55dfc1bcc
--- /dev/null
+++ b/ble/.gdbinit
@@ -0,0 +1,3 @@
+file build/max32665.elf
+target remote localhost:3333
+
diff --git a/ble/.project b/ble/.project
new file mode 100644
index 0000000000000000000000000000000000000000..f87dce9ca24d97fb9eedab424b85796010af452e
--- /dev/null
+++ b/ble/.project
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>BLE_fit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/ble/.settings/language.settings.xml b/ble/.settings/language.settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e5a1647610f97197abe406e8ef1bb9e62065f5a1
--- /dev/null
+++ b/ble/.settings/language.settings.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+    <configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" name="Debug">
+        <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+            <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+            <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+            <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+        </extension>
+    </configuration>
+</project>
diff --git a/ble/BLE_fit.launch b/ble/BLE_fit.launch
new file mode 100644
index 0000000000000000000000000000000000000000..61aab03847a6bacc23c49b9379148c245aaf522b
--- /dev/null
+++ b/ble/BLE_fit.launch
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="ilg.gnuarmeclipse.debug.gdbjtag.openocd.launchConfigurationType">
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="openocd"/>
+<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerOther" value="-s ${env_var:TOOLCHAIN_PATH}/share/openocd/scripts -f  interface/ftdi/olimex-arm-usb-ocd-h.cfg -f interface/ftdi/olimex-arm-jtag-swd.cfg -f target/max32665.cfg"/>
+<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU ARM OpenOCD"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
+<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
+<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
+<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
+<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
+<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
+<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/max32665.elf"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="BLE_fit"/>
+<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/BLE_fit"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#13;&#10;&lt;memoryBlockExpression address=&quot;536918388&quot; label=&quot;0x2000b974&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>
+<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
+</launchConfiguration>
diff --git a/ble/Makefile b/ble/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d302eacd114b78571329d216128ddea38743bf75
--- /dev/null
+++ b/ble/Makefile
@@ -0,0 +1,140 @@
+################################################################################
+# Copyright (C) 2014 Maxim Integrated Products, Inc., All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+# OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of Maxim Integrated
+# Products, Inc. shall not be used except as stated in the Maxim Integrated
+# Products, Inc. Branding Policy.
+#
+# The mere transfer of this software does not imply any licenses
+# of trade secrets, proprietary technology, copyrights, patents,
+# trademarks, maskwork rights, or any other form of intellectual
+# property whatsoever. Maxim Integrated Products, Inc. retains all
+# ownership rights.
+#
+# $Id: Makefile 38694 2018-10-24 20:41:14Z zach.metzinger $
+#
+################################################################################
+
+# This is the name of the build output file
+ifeq "$(PROJECT)" ""
+PROJECT=max32665
+endif
+
+# Specify the target processor
+ifeq "$(TARGET)" ""
+TARGET=MAX32665
+endif
+
+# Create Target name variables
+TARGET_UC:=$(shell echo $(TARGET) | tr a-z A-Z)
+TARGET_LC:=$(shell echo $(TARGET) | tr A-Z a-z)
+
+# Select 'GCC' or 'IAR' compiler
+COMPILER=GCC
+
+# Specify the board used
+ifeq "$(BOARD)" ""
+#BOARD=EvKit_V1
+BOARD=card10
+endif
+
+# Last octet address modifier
+ifneq "$(BLE_ADDR_LSB)" ""
+PROJ_CFLAGS+=-DBLE_ADDR_LSB=$(BLE_ADDR_LSB)
+endif
+
+## Subsitute WSF critical section entry for default MAXUSB
+#PROJ_CFLAGS+=-DMAXUSB_ENTER_CRITICAL=WsfCsEnter
+#PROJ_CFLAGS+=-DMAXUSB_EXIT_CRITICAL=WsfCsExit
+
+# This is the path to the CMSIS root directory
+ifeq "$(MAXIM_PATH)" ""
+LIBS_DIR=../sdk/Libraries
+NDALIBS_DIR=../sdk/NDALibraries
+else
+LIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/Libraries)
+NDALIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/NDALibraries)
+endif
+CMSIS_ROOT=$(LIBS_DIR)/CMSIS
+
+# Source files for this test (add path to VPATH below)
+SRCS  = main.c
+SRCS += stack_fit.c
+SRCS += fit_main.c
+SRCS += svc_dis.c
+
+# Where to find source files for this test
+VPATH  = .
+
+# Where to find header files for this test
+IPATH  = .
+
+# Enable assertion checking for development
+PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE
+
+# Specify the target revision to override default
+# "A2" in ASCII
+# TARGET_REV=0x4132
+
+# Use this variables to specify and alternate tool path
+#TOOL_DIR=/opt/gcc-arm-none-eabi-4_8-2013q4/bin
+
+# Use these variables to add project specific tool options
+#PROJ_CFLAGS+=--specs=nano.specs
+#PROJ_LDFLAGS+=--specs=nano.specs
+
+PROJ_CFLAGS+=-std=c99
+
+# Point this variable to a startup file to override the default file
+#STARTUPFILE=start.S
+
+# Override the default optimization level using this variable
+#MXC_OPTIMIZE_CFLAGS=-O1
+
+# Point this variable to a linker file to override the default file
+ifneq "$(APP)" ""
+LINKERFILE=$(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC/$(TARGET_LC)_app.ld
+endif
+
+################################################################################
+# Include external library makefiles here
+
+# Include the BSP
+BOARD_DIR=$(LIBS_DIR)/Boards/$(BOARD)
+include $(BOARD_DIR)/board.mk
+
+# Include the Peripheral Driver Library
+PERIPH_DRIVER_DIR=$(LIBS_DIR)/$(TARGET)PeriphDriver
+include ${PERIPH_DRIVER_DIR}/periphdriver.mk
+
+# Include Cordio BTLE Library
+TRACE=1
+CORDIO_DIR=$(NDALIBS_DIR)/BTLE
+include ${CORDIO_DIR}/btle.mk
+
+# Include MAXUSB library
+MAXUSB_DIR=$(LIBS_DIR)/MAXUSB
+include $(MAXUSB_DIR)/maxusb.mk
+
+################################################################################
+# Include the rules for building for this target. All other makefiles should be
+# included before this one.
+include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk
diff --git a/ble/build_image b/ble/build_image
new file mode 100755
index 0000000000000000000000000000000000000000..efcda785f8ef3137326531e085cdccaa7baac919
--- /dev/null
+++ b/ble/build_image
@@ -0,0 +1,5 @@
+make clean
+make APP=1
+make build/max32665.bin
+cp build/max32665.bin card10.bin
+python ../bootloader/crc_patch.py card10.bin
diff --git a/ble/card10.bin b/ble/card10.bin
new file mode 100755
index 0000000000000000000000000000000000000000..cd36d5a1e2ba6831faf14db9728359de670c688b
Binary files /dev/null and b/ble/card10.bin differ
diff --git a/ble/fit.launch b/ble/fit.launch
new file mode 100644
index 0000000000000000000000000000000000000000..8626291bfd99c08b8112481bb886daddc3c586d9
--- /dev/null
+++ b/ble/fit.launch
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="ilg.gnuarmeclipse.debug.gdbjtag.openocd.launchConfigurationType">
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
+<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="openocd"/>
+<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerOther" value="-s ${env_var:TOOLCHAIN_PATH}/share/openocd/scripts -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -f target/MAX32650.cfg"/>
+<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
+<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU ARM OpenOCD"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
+<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
+<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
+<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
+<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
+<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
+<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
+<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
+<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
+<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
+<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
+<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/fit.elf"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="fit"/>
+<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/fit"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#13;&#10;"/>
+<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
+</launchConfiguration>
diff --git a/ble/fit_api.h b/ble/fit_api.h
new file mode 100644
index 0000000000000000000000000000000000000000..aade452df891b30a71d5d968294600a4bbb22da2
--- /dev/null
+++ b/ble/fit_api.h
@@ -0,0 +1,76 @@
+/*************************************************************************************************/
+/*!
+ *  \file
+ *
+ *  \brief  Fitness sample application interface.
+ *
+ *  Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
+ *  ARM Ltd. confidential and proprietary.
+ *
+ *  IMPORTANT.  Your use of this file is governed by a Software License Agreement
+ *  ("Agreement") that must be accepted in order to download or otherwise receive a
+ *  copy of this file.  You may not use or copy this file for any purpose other than
+ *  as described in the Agreement.  If you do not agree to all of the terms of the
+ *  Agreement do not use this file and delete all copies in your possession or control;
+ *  if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
+ *  to any use, copying or further distribution of this software.
+ */
+/*************************************************************************************************/
+#ifndef FIT_API_H
+#define FIT_API_H
+
+#include "wsf_os.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**************************************************************************************************
+  Macros
+**************************************************************************************************/
+
+#ifndef FIT_CONN_MAX
+#define FIT_CONN_MAX                  1
+#endif
+
+/**************************************************************************************************
+  Function Declarations
+**************************************************************************************************/
+/*************************************************************************************************/
+/*!
+ *  \brief  Start the application.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitStart(void);
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Application handler init function called during system initialization.
+ *
+ *  \param  handlerID  WSF handler ID for App.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitHandlerInit(wsfHandlerId_t handlerId);
+
+
+/*************************************************************************************************/
+/*!
+ *  \brief  WSF event handler for the application.
+ *
+ *  \param  event   WSF event mask.
+ *  \param  pMsg    WSF message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* FIT_API_H */
diff --git a/ble/fit_main.c b/ble/fit_main.c
new file mode 100644
index 0000000000000000000000000000000000000000..6691b4eb94f4a8317720f4b418e1de14e1d410ec
--- /dev/null
+++ b/ble/fit_main.c
@@ -0,0 +1,750 @@
+/*************************************************************************************************/
+/*!
+ *  \file
+ *
+ *  \brief  Fitness sample application for the following profiles:
+ *            Heart Rate profile
+ *
+ *  Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
+ *  ARM Ltd. confidential and proprietary.
+ *
+ *  IMPORTANT.  Your use of this file is governed by a Software License Agreement
+ *  ("Agreement") that must be accepted in order to download or otherwise receive a
+ *  copy of this file.  You may not use or copy this file for any purpose other than
+ *  as described in the Agreement.  If you do not agree to all of the terms of the
+ *  Agreement do not use this file and delete all copies in your possession or control;
+ *  if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
+ *  to any use, copying or further distribution of this software.
+ */
+/*************************************************************************************************/
+
+#include <string.h>
+#include "wsf_types.h"
+#include "util/bstream.h"
+#include "wsf_msg.h"
+#include "wsf_trace.h"
+#include "hci_api.h"
+#include "dm_api.h"
+#include "att_api.h"
+#include "smp_api.h"
+#include "app_api.h"
+#include "app_db.h"
+#include "app_ui.h"
+#include "app_hw.h"
+#include "svc_ch.h"
+#include "svc_core.h"
+#include "svc_hrs.h"
+#include "svc_dis.h"
+#include "svc_batt.h"
+#include "svc_rscs.h"
+#include "bas/bas_api.h"
+#include "hrps/hrps_api.h"
+#include "rscp/rscp_api.h"
+#include "fit_api.h"
+
+/**************************************************************************************************
+  Macros
+**************************************************************************************************/
+
+/*! WSF message event starting value */
+#define FIT_MSG_START               0xA0
+
+/* Default Running Speed and Cadence Measurement period (seconds) */
+#define FIT_DEFAULT_RSCM_PERIOD        1
+
+/*! WSF message event enumeration */
+enum
+{
+  FIT_HR_TIMER_IND = FIT_MSG_START,       /*! Heart rate measurement timer expired */
+  FIT_BATT_TIMER_IND,                     /*! Battery measurement timer expired */
+  FIT_RUNNING_TIMER_IND                   /*! Running speed and cadence measurement timer expired */
+};
+
+/**************************************************************************************************
+  Data Types
+**************************************************************************************************/
+
+/*! Application message type */
+typedef union
+{
+  wsfMsgHdr_t     hdr;
+  dmEvt_t         dm;
+  attsCccEvt_t    ccc;
+  attEvt_t        att;
+} fitMsg_t;
+
+/**************************************************************************************************
+  Configurable Parameters
+**************************************************************************************************/
+
+/*! configurable parameters for advertising */
+/* These intervals directly impact energy usage during the non-connected/advertising mode */
+static const appAdvCfg_t fitAdvCfg =
+{
+  { 1000,     0,     0},                  /*! Advertising durations in ms */
+  {   96,   200,     0}                   /*! Advertising intervals in 0.625 ms units */
+};
+
+/*! configurable parameters for slave */
+static const appSlaveCfg_t fitSlaveCfg =
+{
+  FIT_CONN_MAX,                           /*! Maximum connections */
+};
+
+/*! configurable parameters for security */
+static const appSecCfg_t fitSecCfg =
+{
+  DM_AUTH_BOND_FLAG | DM_AUTH_SC_FLAG,    /*! Authentication and bonding flags */
+  0,                                      /*! Initiator key distribution flags */
+  DM_KEY_DIST_LTK,                        /*! Responder key distribution flags */
+  FALSE,                                  /*! TRUE if Out-of-band pairing data is present */
+  TRUE                                    /*! TRUE to initiate security upon connection */
+};
+
+/*! configurable parameters for connection parameter update */
+static const appUpdateCfg_t fitUpdateCfg =
+{
+  6000,                                   /*! Connection idle period in ms before attempting
+                                              connection parameter update; set to zero to disable */
+  640,                                    /*! Minimum connection interval in 1.25ms units */
+  800,                                    /*! Maximum connection interval in 1.25ms units */
+  0,                                      /*! Connection latency */
+  900,                                    /*! Supervision timeout in 10ms units */
+  5                                       /*! Number of update attempts before giving up */
+};
+
+/*! heart rate measurement configuration */
+static const hrpsCfg_t fitHrpsCfg =
+{
+  2000      /*! Measurement timer expiration period in ms */
+};
+
+/*! battery measurement configuration */
+static const basCfg_t fitBasCfg =
+{
+  30,       /*! Battery measurement timer expiration period in seconds */
+  1,        /*! Perform battery measurement after this many timer periods */
+  100       /*! Send battery level notification to peer when below this level. */
+};
+
+/*! SMP security parameter configuration */
+static const smpCfg_t fitSmpCfg =
+{
+  3000,                                   /*! 'Repeated attempts' timeout in msec */
+  SMP_IO_NO_IN_NO_OUT,                    /*! I/O Capability */
+  7,                                      /*! Minimum encryption key length */
+  16,                                     /*! Maximum encryption key length */
+  3,                                      /*! Attempts to trigger 'repeated attempts' timeout */
+  0,                                      /*! Device authentication requirements */
+};
+
+/**************************************************************************************************
+  Advertising Data
+**************************************************************************************************/
+
+/*! advertising data, discoverable mode */
+static const uint8_t fitAdvDataDisc[] =
+{
+  /*! flags */
+  2,                                      /*! length */
+  DM_ADV_TYPE_FLAGS,                      /*! AD type */
+  DM_FLAG_LE_GENERAL_DISC |               /*! flags */
+  DM_FLAG_LE_BREDR_NOT_SUP,
+
+  /*! tx power */
+  2,                                      /*! length */
+  DM_ADV_TYPE_TX_POWER,                   /*! AD type */
+  0,                                      /*! tx power */
+
+  /*! service UUID list */
+  9,                                      /*! length */
+  DM_ADV_TYPE_16_UUID,                    /*! AD type */
+  UINT16_TO_BYTES(ATT_UUID_HEART_RATE_SERVICE),
+  UINT16_TO_BYTES(ATT_UUID_RUNNING_SPEED_SERVICE),
+  UINT16_TO_BYTES(ATT_UUID_DEVICE_INFO_SERVICE),
+  UINT16_TO_BYTES(ATT_UUID_BATTERY_SERVICE)
+};
+
+/*! scan data, discoverable mode */
+static const uint8_t fitScanDataDisc[] =
+{
+  /*! device name */
+  4,                                      /*! length */
+  DM_ADV_TYPE_LOCAL_NAME,                 /*! AD type */
+  'F',
+  'i',
+  't'
+};
+
+/**************************************************************************************************
+  Client Characteristic Configuration Descriptors
+**************************************************************************************************/
+
+/*! enumeration of client characteristic configuration descriptors */
+enum
+{
+  FIT_GATT_SC_CCC_IDX,                    /*! GATT service, service changed characteristic */
+  FIT_HRS_HRM_CCC_IDX,                    /*! Heart rate service, heart rate monitor characteristic */
+  FIT_BATT_LVL_CCC_IDX,                   /*! Battery service, battery level characteristic */
+  FIT_RSCS_SM_CCC_IDX,                   /*! Runninc speed and cadence measurement characteristic */
+  FIT_NUM_CCC_IDX
+};
+
+/*! client characteristic configuration descriptors settings, indexed by above enumeration */
+static const attsCccSet_t fitCccSet[FIT_NUM_CCC_IDX] =
+{
+  /* cccd handle          value range               security level */
+  {GATT_SC_CH_CCC_HDL,    ATT_CLIENT_CFG_INDICATE,  DM_SEC_LEVEL_NONE},   /* FIT_GATT_SC_CCC_IDX */
+  {HRS_HRM_CH_CCC_HDL,    ATT_CLIENT_CFG_NOTIFY,    DM_SEC_LEVEL_NONE},   /* FIT_HRS_HRM_CCC_IDX */
+  {BATT_LVL_CH_CCC_HDL,   ATT_CLIENT_CFG_NOTIFY,    DM_SEC_LEVEL_NONE},   /* FIT_BATT_LVL_CCC_IDX */
+  {RSCS_RSM_CH_CCC_HDL,   ATT_CLIENT_CFG_NOTIFY,    DM_SEC_LEVEL_NONE}    /* FIT_RSCS_SM_CCC_IDX */
+};
+
+/**************************************************************************************************
+  Global Variables
+**************************************************************************************************/
+
+/*! WSF handler ID */
+wsfHandlerId_t fitHandlerId;
+
+/* WSF Timer to send running speed and cadence measurement data */
+wsfTimer_t     fitRscmTimer;
+
+/* Running Speed and Cadence Measurement period - Can be changed at runtime to vary period */
+static uint16_t fitRscmPeriod = FIT_DEFAULT_RSCM_PERIOD;
+
+/* Heart Rate Monitor feature flags */
+static uint8_t fitHrmFlags = CH_HRM_FLAGS_VALUE_8BIT | CH_HRM_FLAGS_ENERGY_EXP;
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Application DM callback.
+ *
+ *  \param  pDmEvt  DM callback event
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitDmCback(dmEvt_t *pDmEvt)
+{
+  dmEvt_t *pMsg;
+  uint16_t len;
+
+  len = DmSizeOfEvt(pDmEvt);
+
+  if ((pMsg = WsfMsgAlloc(len)) != NULL)
+  {
+    memcpy(pMsg, pDmEvt, len);
+    WsfMsgSend(fitHandlerId, pMsg);
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Application ATT callback.
+ *
+ *  \param  pEvt    ATT callback event
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitAttCback(attEvt_t *pEvt)
+{
+  attEvt_t *pMsg;
+
+  if ((pMsg = WsfMsgAlloc(sizeof(attEvt_t) + pEvt->valueLen)) != NULL)
+  {
+    memcpy(pMsg, pEvt, sizeof(attEvt_t));
+    pMsg->pValue = (uint8_t *) (pMsg + 1);
+    memcpy(pMsg->pValue, pEvt->pValue, pEvt->valueLen);
+    WsfMsgSend(fitHandlerId, pMsg);
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Application ATTS client characteristic configuration callback.
+ *
+ *  \param  pDmEvt  DM callback event
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitCccCback(attsCccEvt_t *pEvt)
+{
+  attsCccEvt_t  *pMsg;
+  appDbHdl_t    dbHdl;
+
+  /* if CCC not set from initialization and there's a device record */
+  if ((pEvt->handle != ATT_HANDLE_NONE) &&
+      ((dbHdl = AppDbGetHdl((dmConnId_t) pEvt->hdr.param)) != APP_DB_HDL_NONE))
+  {
+    /* store value in device database */
+    AppDbSetCccTblValue(dbHdl, pEvt->idx, pEvt->value);
+  }
+
+  if ((pMsg = WsfMsgAlloc(sizeof(attsCccEvt_t))) != NULL)
+  {
+    memcpy(pMsg, pEvt, sizeof(attsCccEvt_t));
+    WsfMsgSend(fitHandlerId, pMsg);
+  }
+}
+
+
+/*************************************************************************************************/
+/*!
+*  \brief  Send a Running Speed and Cadence Measurement Notification.
+*
+*  \param  connId    connection ID
+*
+*  \return None.
+*/
+/*************************************************************************************************/
+static void fitSendRunningSpeedMeasurement(dmConnId_t connId)
+{
+  if (AttsCccEnabled(connId, FIT_RSCS_SM_CCC_IDX))
+  {
+    static uint8_t walk_run = 1;
+
+    /* TODO: Set Running Speed and Cadence Measurement Parameters */
+
+    RscpsSetParameter(RSCP_SM_PARAM_SPEED, 1);
+    RscpsSetParameter(RSCP_SM_PARAM_CADENCE, 2);
+    RscpsSetParameter(RSCP_SM_PARAM_STRIDE_LENGTH, 3);
+    RscpsSetParameter(RSCP_SM_PARAM_TOTAL_DISTANCE, 4);
+
+    /* Toggle running/walking */
+    walk_run = walk_run? 0 : 1;
+    RscpsSetParameter(RSCP_SM_PARAM_STATUS, walk_run);
+
+    RscpsSendSpeedMeasurement(connId);
+  }
+
+  /* Configure and start timer to send the next measurement */
+  fitRscmTimer.msg.event = FIT_RUNNING_TIMER_IND;
+  fitRscmTimer.msg.status = FIT_RSCS_SM_CCC_IDX;
+  fitRscmTimer.handlerId = fitHandlerId;
+  fitRscmTimer.msg.param = connId;
+
+  WsfTimerStartSec(&fitRscmTimer, fitRscmPeriod);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Process CCC state change.
+ *
+ *  \param  pMsg    Pointer to message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitProcCccState(fitMsg_t *pMsg)
+{
+  APP_TRACE_INFO3("ccc state ind value:%d handle:%d idx:%d", pMsg->ccc.value, pMsg->ccc.handle, pMsg->ccc.idx);
+
+  /* handle heart rate measurement CCC */
+  if (pMsg->ccc.idx == FIT_HRS_HRM_CCC_IDX)
+  {
+    if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY)
+    {
+      HrpsMeasStart((dmConnId_t) pMsg->ccc.hdr.param, FIT_HR_TIMER_IND, FIT_HRS_HRM_CCC_IDX);
+    }
+    else
+    {
+      HrpsMeasStop((dmConnId_t) pMsg->ccc.hdr.param);
+    }
+    return;
+  }
+
+  /* handle running speed and cadence measurement CCC */
+  if (pMsg->ccc.idx == FIT_RSCS_SM_CCC_IDX)
+  {
+    if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY)
+    {
+      fitSendRunningSpeedMeasurement((dmConnId_t)pMsg->ccc.hdr.param);
+    }
+    else
+    {
+      WsfTimerStop(&fitRscmTimer);
+    }
+    return;
+  }
+
+  /* handle battery level CCC */
+  if (pMsg->ccc.idx == FIT_BATT_LVL_CCC_IDX)
+  {
+    if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY)
+    {
+      BasMeasBattStart((dmConnId_t) pMsg->ccc.hdr.param, FIT_BATT_TIMER_IND, FIT_BATT_LVL_CCC_IDX);
+    }
+    else
+    {
+      BasMeasBattStop((dmConnId_t) pMsg->ccc.hdr.param);
+    }
+    return;
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Perform UI actions on connection close.
+ *
+ *  \param  pMsg    Pointer to message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitClose(fitMsg_t *pMsg)
+{
+  /* stop heart rate measurement */
+  HrpsMeasStop((dmConnId_t) pMsg->hdr.param);
+
+  /* stop battery measurement */
+  BasMeasBattStop((dmConnId_t) pMsg->hdr.param);
+
+  /* Stop running speed and cadence timer */
+  WsfTimerStop(&fitRscmTimer);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Set up advertising and other procedures that need to be performed after
+ *          device reset.
+ *
+ *  \param  pMsg    Pointer to message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitSetup(fitMsg_t *pMsg)
+{
+  /* set advertising and scan response data for discoverable mode */
+  AppAdvSetData(APP_ADV_DATA_DISCOVERABLE, sizeof(fitAdvDataDisc), (uint8_t *) fitAdvDataDisc);
+  AppAdvSetData(APP_SCAN_DATA_DISCOVERABLE, sizeof(fitScanDataDisc), (uint8_t *) fitScanDataDisc);
+
+  /* set advertising and scan response data for connectable mode */
+  AppAdvSetData(APP_ADV_DATA_CONNECTABLE, 0, NULL);
+  AppAdvSetData(APP_SCAN_DATA_CONNECTABLE, 0, NULL);
+
+  /* start advertising; automatically set connectable/discoverable mode and bondable mode */
+  AppAdvStart(APP_MODE_AUTO_INIT);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Button press callback.
+ *
+ *  \param  btn    Button press.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitBtnCback(uint8_t btn)
+{
+  dmConnId_t      connId;
+  static uint8_t  heartRate = 78;    /* for testing/demonstration */
+
+  /* button actions when connected */
+  if ((connId = AppConnIsOpen()) != DM_CONN_ID_NONE)
+  {
+    switch (btn)
+    {
+      case APP_UI_BTN_1_SHORT:
+        /* increment the heart rate */
+        AppHwHrmTest(++heartRate);
+        break;
+
+      case APP_UI_BTN_1_MED:
+        break;
+
+      case APP_UI_BTN_1_LONG:
+        AppConnClose(connId);
+        break;
+
+      case APP_UI_BTN_2_SHORT:
+        /* decrement the heart rate */
+        AppHwHrmTest(--heartRate);
+        break;
+
+      case APP_UI_BTN_2_MED:
+        /* Toggle HRM Sensor DET flags */
+        if (!(fitHrmFlags & (CH_HRM_FLAGS_SENSOR_DET | CH_HRM_FLAGS_SENSOR_NOT_DET)))
+        {
+          fitHrmFlags |= CH_HRM_FLAGS_SENSOR_DET;
+        }
+        else if (fitHrmFlags & CH_HRM_FLAGS_SENSOR_DET)
+        {
+          fitHrmFlags &= ~CH_HRM_FLAGS_SENSOR_DET;
+          fitHrmFlags |= CH_HRM_FLAGS_SENSOR_NOT_DET;
+        }
+        else
+        {
+          fitHrmFlags &= ~CH_HRM_FLAGS_SENSOR_NOT_DET;
+        }
+
+        HrpsSetFlags(fitHrmFlags);
+        break;
+
+      case APP_UI_BTN_2_LONG:
+        /* Toggle HRM RR Interval feature flag */
+        if (fitHrmFlags & CH_HRM_FLAGS_RR_INTERVAL)
+        {
+          fitHrmFlags &= ~CH_HRM_FLAGS_RR_INTERVAL;
+        }
+        else
+        {
+          fitHrmFlags |= CH_HRM_FLAGS_RR_INTERVAL;
+        }
+
+        HrpsSetFlags(fitHrmFlags);
+        break;
+
+      default:
+        break;
+    }
+  }
+  /* button actions when not connected */
+  else
+  {
+    switch (btn)
+    {
+      case APP_UI_BTN_1_SHORT:
+        /* start or restart advertising */
+        AppAdvStart(APP_MODE_AUTO_INIT);
+        break;
+
+      case APP_UI_BTN_1_MED:
+        /* enter discoverable and bondable mode mode */
+        AppSetBondable(TRUE);
+        AppAdvStart(APP_MODE_DISCOVERABLE);
+        break;
+
+      case APP_UI_BTN_1_LONG:
+        /* clear bonded device info and restart advertising */
+        AppDbDeleteAllRecords();
+        AppAdvStart(APP_MODE_AUTO_INIT);
+        break;
+
+      case APP_UI_BTN_2_SHORT:
+        /* Toggle HRM Flag for 8 and 16 bit values */
+        if (fitHrmFlags & CH_HRM_FLAGS_VALUE_16BIT)
+        {
+          fitHrmFlags &= ~CH_HRM_FLAGS_VALUE_16BIT;
+        }
+        else
+        {
+          fitHrmFlags |= CH_HRM_FLAGS_VALUE_16BIT;
+        }
+
+        HrpsSetFlags(fitHrmFlags);
+        break;
+
+      default:
+        break;
+    }
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Process messages from the event handler.
+ *
+ *  \param  pMsg    Pointer to message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void fitProcMsg(fitMsg_t *pMsg)
+{
+  uint8_t uiEvent = APP_UI_NONE;
+
+  switch(pMsg->hdr.event)
+  {
+    case FIT_RUNNING_TIMER_IND:
+      fitSendRunningSpeedMeasurement((dmConnId_t)pMsg->ccc.hdr.param);
+      break;
+
+    case FIT_HR_TIMER_IND:
+      HrpsProcMsg(&pMsg->hdr);
+      break;
+
+    case FIT_BATT_TIMER_IND:
+      BasProcMsg(&pMsg->hdr);
+      break;
+
+    case ATTS_HANDLE_VALUE_CNF:
+      HrpsProcMsg(&pMsg->hdr);
+      BasProcMsg(&pMsg->hdr);
+      break;
+
+    case ATTS_CCC_STATE_IND:
+      fitProcCccState(pMsg);
+      break;
+
+    case DM_RESET_CMPL_IND:
+      DmSecGenerateEccKeyReq();
+      fitSetup(pMsg);
+      uiEvent = APP_UI_RESET_CMPL;
+      break;
+
+    case DM_ADV_START_IND:
+      uiEvent = APP_UI_ADV_START;
+      break;
+
+    case DM_ADV_STOP_IND:
+      uiEvent = APP_UI_ADV_STOP;
+      break;
+
+    case DM_CONN_OPEN_IND:
+      HrpsProcMsg(&pMsg->hdr);
+      BasProcMsg(&pMsg->hdr);
+      uiEvent = APP_UI_CONN_OPEN;
+      break;
+
+    case DM_CONN_CLOSE_IND:
+      fitClose(pMsg);
+      uiEvent = APP_UI_CONN_CLOSE;
+      break;
+
+    case DM_SEC_PAIR_CMPL_IND:
+      uiEvent = APP_UI_SEC_PAIR_CMPL;
+      break;
+
+    case DM_SEC_PAIR_FAIL_IND:
+      uiEvent = APP_UI_SEC_PAIR_FAIL;
+      break;
+
+    case DM_SEC_ENCRYPT_IND:
+      uiEvent = APP_UI_SEC_ENCRYPT;
+      break;
+
+    case DM_SEC_ENCRYPT_FAIL_IND:
+      uiEvent = APP_UI_SEC_ENCRYPT_FAIL;
+      break;
+
+    case DM_SEC_AUTH_REQ_IND:
+      AppHandlePasskey(&pMsg->dm.authReq);
+      break;
+
+    case DM_SEC_ECC_KEY_IND:
+      DmSecSetEccKey(&pMsg->dm.eccMsg.data.key);
+      break;
+
+    case DM_SEC_COMPARE_IND:
+      AppHandleNumericComparison(&pMsg->dm.cnfInd);
+      break;
+
+    case DM_HW_ERROR_IND:
+      uiEvent = APP_UI_HW_ERROR;
+      break;
+
+    default:
+      break;
+  }
+
+  if (uiEvent != APP_UI_NONE)
+  {
+    AppUiAction(uiEvent);
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Application handler init function called during system initialization.
+ *
+ *  \param  handlerID  WSF handler ID.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitHandlerInit(wsfHandlerId_t handlerId)
+{
+  APP_TRACE_INFO0("FitHandlerInit");
+
+  /* store handler ID */
+  fitHandlerId = handlerId;
+
+  /* Set configuration pointers */
+  pAppAdvCfg = (appAdvCfg_t *) &fitAdvCfg;
+  pAppSlaveCfg = (appSlaveCfg_t *) &fitSlaveCfg;
+  pAppSecCfg = (appSecCfg_t *) &fitSecCfg;
+  pAppUpdateCfg = (appUpdateCfg_t *) &fitUpdateCfg;
+
+  /* Initialize application framework */
+  AppSlaveInit();
+
+  /* Set stack configuration pointers */
+  pSmpCfg = (smpCfg_t *) &fitSmpCfg;
+
+  /* initialize heart rate profile sensor */
+  HrpsInit(handlerId, (hrpsCfg_t *) &fitHrpsCfg);
+  HrpsSetFlags(fitHrmFlags);
+
+  /* initialize battery service server */
+  BasInit(handlerId, (basCfg_t *) &fitBasCfg);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  WSF event handler for application.
+ *
+ *  \param  event   WSF event mask.
+ *  \param  pMsg    WSF message.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg)
+{
+  if (pMsg != NULL)
+  {
+    APP_TRACE_INFO1("Fit got evt %d", pMsg->event);
+
+    if (pMsg->event >= DM_CBACK_START && pMsg->event <= DM_CBACK_END)
+    {
+      /* process advertising and connection-related messages */
+      AppSlaveProcDmMsg((dmEvt_t *) pMsg);
+
+      /* process security-related messages */
+      AppSlaveSecProcDmMsg((dmEvt_t *) pMsg);
+    }
+
+    /* perform profile and user interface-related operations */
+    fitProcMsg((fitMsg_t *) pMsg);
+  }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Start the application.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void FitStart(void)
+{
+  /* Register for stack callbacks */
+  DmRegister(fitDmCback);
+  DmConnRegister(DM_CLIENT_ID_APP, fitDmCback);
+  AttRegister(fitAttCback);
+  AttConnRegister(AppServerConnCback);
+  AttsCccRegister(FIT_NUM_CCC_IDX, (attsCccSet_t *) fitCccSet, fitCccCback);
+
+  /* Register for app framework callbacks */
+  AppUiBtnRegister(fitBtnCback);
+
+  /* Initialize attribute server database */
+  SvcCoreAddGroup();
+  SvcHrsCbackRegister(NULL, HrpsWriteCback);
+  SvcHrsAddGroup();
+  SvcDisAddGroup();
+  SvcBattCbackRegister(BasReadCback, NULL);
+  SvcBattAddGroup();
+  SvcRscsAddGroup();
+
+  /* Set running speed and cadence features */
+  RscpsSetFeatures(RSCS_ALL_FEATURES);
+
+  /* Reset the device */
+  DmDevReset();
+}
diff --git a/ble/main.c b/ble/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..a1dd73a843969e1afb892d38df94cb87b9719d93
--- /dev/null
+++ b/ble/main.c
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *
+ * $Date: 2019-02-11 23:36:35 +0000 (Mon, 11 Feb 2019) $
+ * $Revision: 40967 $
+ *
+ ******************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include "wsf_types.h"
+#include "wsf_os.h"
+#include "wsf_buf.h"
+#include "wsf_timer.h"
+#include "wsf_trace.h"
+#include "app_ui.h"
+#include "ll_api.h"
+#include "sch_api.h"
+#include "fit/fit_api.h"
+#include "mxc_config.h"
+#include "gcr_regs.h"
+#include "mcr_regs.h"
+#include "hci_core.h"
+
+/**************************************************************************************************
+  Macros
+**************************************************************************************************/
+
+/* Number of WSF buffer pools */
+#define WSF_BUF_POOLS              6
+
+/* Size of buffer for stdio functions */
+#define PRINTF_BUF_SIZE 128
+
+/**************************************************************************************************
+  Local Variables
+**************************************************************************************************/
+
+/*! Buffer for stdio functions */
+char printf_buffer[PRINTF_BUF_SIZE];
+
+/*! Free memory for pool buffers (use word elements for word alignment). */
+static uint32_t mainBufMem[3584/sizeof(uint32_t)+96];
+
+/*! Default pool descriptor. */
+static wsfBufPoolDesc_t mainPoolDesc[WSF_BUF_POOLS] =
+{
+  {  16,  8 },
+  {  32,  4 },
+  {  64,  4 },
+  { 128,  4 },
+  { 256,  4 },
+  { 384,  4 }
+};
+
+/**************************************************************************************************
+  Functions
+**************************************************************************************************/
+
+/*! \brief  Stack initialization for app. */
+extern void StackInitFit(void);
+
+void HciVsSetPublicAddr(uint8_t *bdAddr);
+
+/*************************************************************************************************/
+void SysTick_Handler(void)
+{
+    WsfTimerUpdate(1);
+}
+
+/*************************************************************************************************/
+static void myTrace(const char *pStr, va_list args)
+{
+    extern uint8_t wsfCsNesting;
+
+    if (wsfCsNesting == 0)
+    {
+        vprintf(pStr, args);
+        printf("\r\n");
+    }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Initialize WSF.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+static void WsfInit(void)
+{
+    WsfTimerInit();
+    WsfBufInit(sizeof(mainBufMem), (uint8_t*)mainBufMem, WSF_BUF_POOLS, mainPoolDesc);
+    WsfTraceRegister(myTrace);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Initialize platform.
+ *
+ *  \param  msPerTick   Milliseconds per timer tick.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void PlatformInit(void)
+{
+    /* Change the pullup on the RST pin to 25K */
+    MXC_MCR->ctrl = 0x202;
+
+    /* Set VREGO_D to 1.3V */
+    *((volatile uint32_t*)0x40004410) = 0x50;
+
+    /* Set TX LDO to 1.1V and enable LDO. Set RX LDO to 0.9V and enable LDO */
+    MXC_GCR->btleldocn = 0xD9; // TX 1.1V RX 0.9V
+
+    /* Power up the 32MHz XO */
+    MXC_GCR->clkcn |= MXC_F_GCR_CLKCN_X32M_EN;
+
+    /* Enable peripheral clocks */
+    MXC_GCR->perckcn0 &= ~(MXC_F_GCR_PERCKCN0_GPIO0D | MXC_F_GCR_PERCKCN0_GPIO1D);  // Clear GPIO0 and GPIO1 Disable
+    MXC_GCR->perckcn1 &= ~(MXC_F_GCR_PERCKCN1_BTLED | MXC_F_GCR_PERCKCN1_TRNGD );  // Clear BTLE and ICACHE0 disable
+
+    /* setup the systick */
+    SysTick->LOAD = (SystemCoreClock / 1000) * WSF_MS_PER_TICK;
+    SysTick->VAL = 0;
+    SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
+
+#ifndef __IAR_SYSTEMS_ICC__
+    /* Added to prevent printf() and friends from using malloc() */
+    setvbuf(stdout, printf_buffer, _IOLBF, PRINTF_BUF_SIZE);
+#endif
+}
+
+
+/*
+ * In two-chip solutions, setting the address must wait until the HCI interface is initialized.
+ * This handler can also catch other Application events, but none are currently implemented.
+ * See ble-profiles/sources/apps/app/common/app_ui.c for further details.
+ *
+ */
+void SetAddress(uint8_t event)
+{
+    uint8_t bdAddr[6] = {0x02, 0x02, 0x44, 0x8B, 0x05, 0x00};
+    
+    switch (event) {
+	case APP_UI_RESET_CMPL:
+	    printf("Setting address -- MAC %02X:%02X:%02X:%02X:%02X:%02X\n", bdAddr[5], bdAddr[4], bdAddr[3], bdAddr[2], bdAddr[1], bdAddr[0]);
+	    LlSetBdAddr((uint8_t*)&bdAddr);
+		LlGetBdAddr(hciCoreCb.bdAddr);
+	    break;
+	default:
+	    break;
+    }
+}
+
+/*************************************************************************************************/
+/*!
+ *  \brief  Initialize MAC layer.
+ *
+ *  \param  None.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+extern int8_t tx_rfpower_on;
+void MacInit(void)
+{
+    wsfHandlerId_t handlerId;
+
+    /* Initialize link layer. */
+    BbInit();
+    handlerId = WsfOsSetNextHandler(SchHandler);
+    SchInit(handlerId);
+    LlAdvSlaveInit();
+    LlConnSlaveInit();
+    handlerId = WsfOsSetNextHandler(LlHandler);
+    LlHandlerInit(handlerId);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \fn     main
+ *
+ *  \brief  Entry point for demo software.
+ *
+ *  \param  None.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+int main(void)
+{
+    printf("\n\n***** MAX32665 BLE Fitness Profile *****\n");
+
+    PlatformInit();
+    WsfInit();
+    MacInit();
+    StackInitFit();
+    FitStart();
+
+    printf("tx_rfpower_on = %d\n", tx_rfpower_on);
+    HciVsSetTxPower(-20);
+    //HciVsSetTxPower(-30);
+    //tx_rfpower_on = 10;
+    //LlSetTxPower(10);
+    printf("tx_rfpower_on = %d\n", tx_rfpower_on);
+
+    /* Register a handler for Application events */
+    AppUiActionRegister(SetAddress);
+	
+    printf("Setup Complete\n");
+
+    while (1)
+    {
+        wsfOsDispatcher();
+    }
+}
diff --git a/ble/stack_fit.c b/ble/stack_fit.c
new file mode 100644
index 0000000000000000000000000000000000000000..db5f59997c59a2240c7588859a09e8a387bb112b
--- /dev/null
+++ b/ble/stack_fit.c
@@ -0,0 +1,94 @@
+/*************************************************************************************************/
+/*!
+ *  \file
+ *
+ *  \brief  Stack initialization for fit.
+ *
+ *  Copyright (c) 2016-2017 ARM Ltd. All Rights Reserved.
+ *  ARM Ltd. confidential and proprietary.
+ *
+ *  IMPORTANT.  Your use of this file is governed by a Software License Agreement
+ *  ("Agreement") that must be accepted in order to download or otherwise receive a
+ *  copy of this file.  You may not use or copy this file for any purpose other than
+ *  as described in the Agreement.  If you do not agree to all of the terms of the
+ *  Agreement do not use this file and delete all copies in your possession or control;
+ *  if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
+ *  to any use, copying or further distribution of this software.
+ */
+/*************************************************************************************************/
+
+#include "wsf_types.h"
+#include "wsf_os.h"
+#include "util/bstream.h"
+#include "fit/fit_api.h"
+#include "hci_handler.h"
+#include "dm_handler.h"
+#include "l2c_handler.h"
+#include "att_handler.h"
+#include "smp_handler.h"
+#include "l2c_api.h"
+#include "att_api.h"
+#include "smp_api.h"
+#include "app_api.h"
+#include "svc_dis.h"
+#include "svc_core.h"
+#include "sec_api.h"
+
+/*************************************************************************************************/
+/*!
+ *  \brief      Initialize stack.
+ *
+ *  \return     None.
+ */
+/*************************************************************************************************/
+void StackInitFit(void)
+{
+  wsfHandlerId_t handlerId;
+  uint8_t features[sizeof(uint64_t)];
+  uint8_t mask[sizeof(uint64_t)];
+
+  SecInit();
+  SecAesInit();
+  SecCmacInit();
+  SecEccInit();
+
+  // Only use legacy API.
+  Uint64ToBstream(features, 0);
+  Uint64ToBstream(mask, HCI_LE_SUP_FEAT_LE_EXT_ADV);
+  HciVsSetFeatures(features, mask);
+
+  handlerId = WsfOsSetNextHandler(HciHandler);
+  HciHandlerInit(handlerId);
+
+  handlerId = WsfOsSetNextHandler(DmHandler);
+  DmDevVsInit(0);
+  DmAdvInit();
+  DmConnInit();
+  DmConnSlaveInit();
+  DmSecInit();
+  DmSecLescInit();
+  DmPrivInit();
+  DmHandlerInit(handlerId);
+
+  handlerId = WsfOsSetNextHandler(L2cSlaveHandler);
+  L2cSlaveHandlerInit(handlerId);
+  L2cInit();
+  L2cSlaveInit();
+
+  handlerId = WsfOsSetNextHandler(AttHandler);
+  AttHandlerInit(handlerId);
+  AttsInit();
+  AttsIndInit();
+
+  handlerId = WsfOsSetNextHandler(SmpHandler);
+  SmpHandlerInit(handlerId);
+  SmprInit();
+  SmprScInit();
+  HciSetMaxRxAclLen(100);
+
+  handlerId = WsfOsSetNextHandler(AppHandler);
+  AppHandlerInit(handlerId);
+
+  handlerId = WsfOsSetNextHandler(FitHandler);
+  FitHandlerInit(handlerId);
+}
diff --git a/ble/svc_dis.c b/ble/svc_dis.c
new file mode 100644
index 0000000000000000000000000000000000000000..bbdf8cc18a0b8cbadf3077c80c61c41a9511277f
--- /dev/null
+++ b/ble/svc_dis.c
@@ -0,0 +1,297 @@
+/*************************************************************************************************/
+/*!
+ *  \file   svc_dis.c
+ *        
+ *  \brief  Example Device Information Service implementation.
+ *
+ *          $Date: 2018-04-17 23:02:20 +0000 (Tue, 17 Apr 2018) $
+ *          $Revision: 34673 $
+ *  
+ *  Copyright (c) 2011 Wicentric, Inc., all rights reserved.
+ *  Wicentric confidential and proprietary.
+ *
+ *  IMPORTANT.  Your use of this file is governed by a Software License Agreement
+ *  ("Agreement") that must be accepted in order to download or otherwise receive a
+ *  copy of this file.  You may not use or copy this file for any purpose other than
+ *  as described in the Agreement.  If you do not agree to all of the terms of the
+ *  Agreement do not use this file and delete all copies in your possession or control;
+ *  if you do not have a copy of the Agreement, you must contact Wicentric, Inc. prior
+ *  to any use, copying or further distribution of this software.
+ */
+/*************************************************************************************************/
+
+#include "wsf_types.h"
+#include "att_api.h"
+#include "wsf_trace.h"
+#include "util/bstream.h"
+#include "svc_dis.h"
+#include "svc_cfg.h"
+
+/**************************************************************************************************
+  Macros
+**************************************************************************************************/
+
+/*! Characteristic read permissions */
+#ifndef DIS_SEC_PERMIT_READ
+#define DIS_SEC_PERMIT_READ SVC_SEC_PERMIT_READ
+#endif
+
+/**************************************************************************************************
+ Service variables
+**************************************************************************************************/
+
+/* Device information service declaration */
+static const uint8_t disValSvc[] = {UINT16_TO_BYTES(ATT_UUID_DEVICE_INFO_SERVICE)};
+static const uint16_t disLenSvc = sizeof(disValSvc);
+
+/* Manufacturer name string characteristic */
+static const uint8_t disValMfrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_MFR_HDL), UINT16_TO_BYTES(ATT_UUID_MANUFACTURER_NAME)};
+static const uint16_t disLenMfrCh = sizeof(disValMfrCh);
+
+/* Manufacturer name string */
+static const uint8_t disUuMfr[] = {UINT16_TO_BYTES(ATT_UUID_MANUFACTURER_NAME)};
+static const uint8_t disValMfr[] = "Maxim Integrated";
+static const uint16_t disLenMfr = sizeof(disValMfr) - 1;
+
+/* System ID characteristic */
+static const uint8_t disValSidCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SID_HDL), UINT16_TO_BYTES(ATT_UUID_SYSTEM_ID)};
+static const uint16_t disLenSidCh = sizeof(disValSidCh);
+
+/* System ID */
+static const uint8_t disUuSid[] = {UINT16_TO_BYTES(ATT_UUID_SYSTEM_ID)};
+static uint8_t disValSid[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
+static const uint16_t disLenSid = sizeof(disValSid);    
+
+/* Model number string characteristic */
+static const uint8_t disValMnCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_MN_HDL), UINT16_TO_BYTES(ATT_UUID_MODEL_NUMBER)};
+static const uint16_t disLenMnCh = sizeof(disValMnCh);
+
+/* Model number string */
+static const uint8_t disUuMn[] = {UINT16_TO_BYTES(ATT_UUID_MODEL_NUMBER)};
+static const uint8_t disValMn[] = "MAX32565";
+static const uint16_t disLenMn = sizeof(disValMn) - 1;
+
+/* Serial number string characteristic */
+static const uint8_t disValSnCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SN_HDL), UINT16_TO_BYTES(ATT_UUID_SERIAL_NUMBER)};
+static const uint16_t disLenSnCh = sizeof(disValSnCh);
+
+/* Serial number string */
+static const uint8_t disUuSn[] = {UINT16_TO_BYTES(ATT_UUID_SERIAL_NUMBER)};
+static const uint8_t disValSn[] = "serial num";
+static const uint16_t disLenSn = sizeof(disValSn) - 1;
+
+/* Firmware revision string characteristic */
+static const uint8_t disValFwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_FWR_HDL), UINT16_TO_BYTES(ATT_UUID_FIRMWARE_REV)};
+static const uint16_t disLenFwrCh = sizeof(disValFwrCh);
+
+/* Firmware revision string */
+static const uint8_t disUuFwr[] = {UINT16_TO_BYTES(ATT_UUID_FIRMWARE_REV)};
+static const uint8_t disValFwr[] = "fw rev";
+static const uint16_t disLenFwr = sizeof(disValFwr) - 1;
+
+/* Hardware revision string characteristic */
+static const uint8_t disValHwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_HWR_HDL), UINT16_TO_BYTES(ATT_UUID_HARDWARE_REV)};
+static const uint16_t disLenHwrCh = sizeof(disValHwrCh);
+
+/* Hardware revision string */
+static const uint8_t disUuHwr[] = {UINT16_TO_BYTES(ATT_UUID_HARDWARE_REV)};
+static const uint8_t disValHwr[] = "hw rev";
+static const uint16_t disLenHwr = sizeof(disValHwr) - 1;
+
+/* Software revision string characteristic */
+static const uint8_t disValSwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SWR_HDL), UINT16_TO_BYTES(ATT_UUID_SOFTWARE_REV)};
+static const uint16_t disLenSwrCh = sizeof(disValSwrCh);
+
+/* Software revision string */
+static const uint8_t disUuSwr[] = {UINT16_TO_BYTES(ATT_UUID_SOFTWARE_REV)};
+static const uint8_t disValSwr[] = "sw rev";
+static const uint16_t disLenSwr = sizeof(disValSwr) - 1;
+
+/* Registration certificate data characteristic */
+static const uint8_t disValRcdCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_RCD_HDL), UINT16_TO_BYTES(ATT_UUID_11073_CERT_DATA)};
+static const uint16_t disLenRcdCh = sizeof(disValRcdCh);
+
+/* Registration certificate data */
+static const uint8_t disUuRcd[] = {UINT16_TO_BYTES(ATT_UUID_11073_CERT_DATA)};
+static const uint8_t disValRcd[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static const uint16_t disLenRcd = sizeof(disValRcd);
+
+/* Attribute list for dis group */
+static const attsAttr_t disList[] =
+{
+  {
+    attPrimSvcUuid, 
+    (uint8_t *) disValSvc,
+    (uint16_t *) &disLenSvc, 
+    sizeof(disValSvc),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValMfrCh,
+    (uint16_t *) &disLenMfrCh,
+    sizeof(disValMfrCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuMfr,
+    (uint8_t *) disValMfr,
+    (uint16_t *) &disLenMfr,
+    sizeof(disValMfr) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValSidCh,
+    (uint16_t *) &disLenSidCh,
+    sizeof(disValSidCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuSid,
+    disValSid,
+    (uint16_t *) &disLenSid,
+    sizeof(disValSid),
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValMnCh,
+    (uint16_t *) &disLenMnCh,
+    sizeof(disValMnCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuMn,
+    (uint8_t *) disValMn,
+    (uint16_t *) &disLenMn,
+    sizeof(disValMn) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValSnCh,
+    (uint16_t *) &disLenSnCh,
+    sizeof(disValSnCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuSn,
+    (uint8_t *) disValSn,
+    (uint16_t *) &disLenSn,
+    sizeof(disValSn) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValFwrCh,
+    (uint16_t *) &disLenFwrCh,
+    sizeof(disValFwrCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuFwr,
+    (uint8_t *) disValFwr,
+    (uint16_t *) &disLenFwr,
+    sizeof(disValFwr) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValHwrCh,
+    (uint16_t *) &disLenHwrCh,
+    sizeof(disValHwrCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuHwr,
+    (uint8_t *) disValHwr,
+    (uint16_t *) &disLenHwr,
+    sizeof(disValHwr) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValSwrCh,
+    (uint16_t *) &disLenSwrCh,
+    sizeof(disValSwrCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuSwr,
+    (uint8_t *) disValSwr,
+    (uint16_t *) &disLenSwr,
+    sizeof(disValSwr) - 1,
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+  {
+    attChUuid,
+    (uint8_t *) disValRcdCh,
+    (uint16_t *) &disLenRcdCh,
+    sizeof(disValRcdCh),
+    0,
+    ATTS_PERMIT_READ
+  },
+  {
+    disUuRcd,
+    (uint8_t *) disValRcd,
+    (uint16_t *) &disLenRcd,
+    sizeof(disValRcd),
+    0,
+    DIS_SEC_PERMIT_READ
+  },
+};
+
+/* DIS group structure */
+static attsGroup_t svcDisGroup =
+{
+  NULL,
+  (attsAttr_t *) disList,
+  NULL,
+  NULL,
+  DIS_START_HDL,
+  DIS_END_HDL
+};
+
+/*************************************************************************************************/
+/*!
+ *  \fn     SvcDisAddGroup
+ *        
+ *  \brief  Add the services to the attribute server.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void SvcDisAddGroup(void)
+{
+  AttsAddGroup(&svcDisGroup);
+}
+
+/*************************************************************************************************/
+/*!
+ *  \fn     SvcDisRemoveGroup
+ *        
+ *  \brief  Remove the services from the attribute server.
+ *
+ *  \return None.
+ */
+/*************************************************************************************************/
+void SvcDisRemoveGroup(void)
+{
+  AttsRemoveGroup(DIS_START_HDL);
+}