diff --git a/eclipse-tools/responseTime-analyzer/README.md b/eclipse-tools/responseTime-analyzer/README.md
new file mode 100644
index 0000000..acbf2f7
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/README.md
@@ -0,0 +1,73 @@
+# GSOC_RTA
+
+2019 Google Summer of Code (CPU-GPU Response Time and Mapping Analysis)
+
+## [Table of Contents]
+### 1. Milestone with the goal of each phase
+### 2. Intention
+### 3. Contribution & benefits for the community
+### 4. Contents
+### 5. Diagram Example
+### 6. Validation
+
+# 1. Milestone with the goal of each phase
+- **Response Time Analysis_CPU Part (Part 1)**
+- E2E Latency (Part 2)
+- LET, EC, IC Communication Paradigms to the model (Part 3)
+
+# 2. Intention
+The current APP4MC library does provide several methods which are useful for deriving execution time for a task, a runnable or ticks (pure computation) through the Util package. But methods for response time are still not available. The reason is that response time analysis can be varied depending on the analyzed model so it is hard to be generalized. But since the trends are evolving from homogeneous to heterogeneous platform, the analysis methodology have become much more sophisticated so it is necessary to have CPU response time analysis which can be used for different mapping analysis with a different processing unit type (e.g., GPU).
+
+# 3. Contribution & benefits for the community
+In this project, [a standardized response time analysis methodology](https://www.semanticscholar.org/paper/Finding-Response-Times-in-a-Real-Time-System-Joseph-Pandya/574517d6e47cf9b368003a56088651a1941dcda1)(Mathai Joseph and Paritosh Pandya, 1986) which involves a complex algorithm is used. Not only this, but also a class, `CpuRTA` which is designed for Generic Algorithm Mapping is provided. Since a heterogeneous platfrom usually requires a different analysis methodology for a processing unit according to its type(e.g., CPU & GPU), a class that can be used with GA Mapping and has a built-in general analysis methodology would be very helpful and save a lot of time which otherwise would be spent for implementing the same algorithm for those tasks that are mapped to a particular type of processing units (e.g., CPU). Along with these, another class, `RuntimeUtilRTA` which supports `CpuRTA` class provides several ways to calculate execution time of a task is also provided. The execution time calculation methodology can be different depending on an execution case (e.g., Worst Case, Best Case, Average Case), a transmission type (e.g., Synchronous, Asynchronous) or a different mapping model. This class can be modified and reused for other analysis models if only a method which takes care of a Runnable execution time is adjusted.
+
+# 4. Contents
+Since the target of implementing heterogeneous platform is to achieve better performance and efficiency, just simply calculating response time is not enough. To realize the optimized response time analysis, different mapping analysis for the same given model according to Generic Algorithm should be taken into account. Generic Algorithm would map tasks to different processing units in the form of integer array so that the total sum of each task’s response time according to the each GA generation can be delivered and compared each other to come up with a better solution. For this reason, a public method which returns the total sum of each task’s response time and the relevant private methods that are used to support this method are needed. The corresponding methods are followed below.          
+**Refer to javadoc below for more details.**          
+* [CpuRTA](Add Ref here)
+* [TimeCompIA](Add Ref here)
+* [RuntimeUtilRTA](Add Ref here) 
+* [RTApp](Add Ref here)
+           
+<`CpuRTA.java`>          
+**getCPUResponseTimeSum**          
+Calculate the total sum of response times of the tasks of the given Amalthea model with a GA mapping model          
+**getTaskCPURT**          
+Calculate response time of the given task of the given Amalthea model with a GA mapping model          
+**taskSorting**          
+Sort out the given list of tasks (in order of shorter period first - Rate Monotonic Scheduling)          
+**preciseTestCPURT** (Response Time analysis Equation Explanation)          
+Calculate response time of the observed task according to the periodic tasks response time analysis algorithm.          
+> Ri = Ci + Σj ∈ HP(i) [Ri/Tj]*Cj ([a standardized response time analysis methodology](https://www.semanticscholar.org/paper/Finding-Response-Times-in-a-Real-Time-System-Joseph-Pandya/574517d6e47cf9b368003a56088651a1941dcda1)(Mathai Joseph and Paritosh Pandya, 1986))          
+           
+<`RuntimeUtilRTA.java`>          
+**getExecutionTimeforCPUTask**          
+Calculate execution time of the given task under one of the several configurations.          
+**doesThisTaskTriggerCPUTask**          
+Find out whether the given triggering task(that has an InterProcessTrigger) triggers a GPU task which is newly mapped to CPU.          
+**syncTypeOperation**          
+Calculate execution time of the given runnableList in a synchronous manner.          
+**asyncTypeOperation**          
+Calculate execution time of the given runnableList in an asynchronous manner.          
+**getExecutionTimeForRTARunnable**           
+Calculate execution time of the given runnable.         
+**getRunnableMemoryAccessTime**          
+Calculate memory access time of the observed runnable.          
+> (Explanation)         
+> Read(Write)_Access_Time = Round_UP(Size_of_Read_Labels / 64.0 Bytes) * (Read_Latency / Frequency)        
+
+**isTriggeringTask**         
+Identify whether the given task has an InterProcessTrigger or not.          
+         
+<`RTApp.java`>          
+User Interface Window           
+[APP4RTA_1.0_Description](Add Ref here)
+
+# 5. Diagram Example
+![Class Diagram](Add Ref here)
+
+* Sequence Diagram
+
+
+
+# 6. Validation
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.classpath b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.project b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.project
new file mode 100644
index 0000000..dd2a679
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>gsoc_rta</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.settings/org.eclipse.jdt.core.prefs b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/META-INF/MANIFEST.MF b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..26bdfad
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: APP4MC Amalthea Java Example
+Bundle-SymbolicName: gsoc_rta
+Bundle-Version: 0.9.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Vendor: Eclipse APP4MC
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.app4mc.amalthea.model
+Automatic-Module-Name: app4mc.example.tool.java
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/build.properties b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/build.properties
new file mode 100644
index 0000000..abb7da6
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+bin.includes = META-INF/,\
+               .,\
+               model-input/
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/APP4RTA_1.0_Description.pdf b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/APP4RTA_1.0_Description.pdf
new file mode 100644
index 0000000..ad1c41c
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/APP4RTA_1.0_Description.pdf
Binary files differ
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/Class_Diagram.png b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/Class_Diagram.png
new file mode 100644
index 0000000..96608a1
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/doc/Class_Diagram.png
Binary files differ
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/CpuRTA.java b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/CpuRTA.java
new file mode 100644
index 0000000..93b3745
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/CpuRTA.java
@@ -0,0 +1,489 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Dortmund University of Applied Sciences and Arts.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors: FH Dortmund - initial API and implementation
+ * 
+ *******************************************************************************/
+package org.eclipse.app4mc.gsoc_rta;
+
+import java.io.File;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.amalthea.model.Preemption;
+import org.eclipse.app4mc.amalthea.model.ProcessingUnit;
+import org.eclipse.app4mc.amalthea.model.PuType;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.amalthea.model.Time;
+import org.eclipse.app4mc.amalthea.model.TimeUnit;
+import org.eclipse.app4mc.amalthea.model.io.AmaltheaLoader;
+import org.eclipse.app4mc.amalthea.model.util.FactoryUtil;
+import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil.TimeType;
+import org.eclipse.emf.common.util.EList;
+import imported.CommonUtils;
+
+/**
+ * Date: June 21-2019 
+ * @author Junhyung Ki
+ * @version 1.0
+ *				This class is to analyze Response Times of CPU(e.g., ARM, Denver cores) Tasks in a CPU-GPU Heterogeneous System
+ *				The entire class is designed for Generic Algorithm Mapping to find the most optimized task mapping solution.
+ *				Therefore, setting the integer array variable, 'tpuMapping' (which is considered as a mapping solution) along with 
+ *				others ( Amalthea Model, 'model' setting, Task Response Time HashMap, 'trt' setting (for GPU Tasks), Processing Unit List, 'pul' setting
+ *				should be the first step before executing any response time method.
+ */
+public class CpuRTA {
+	public final File inputFile = new File("model-input/ChallengeModel_release.amxmi");
+	
+	/* synchronous or asynchronous offloading */
+	public boolean synchronousOffloading = false;
+	
+	/* feasibility boolean */
+	public boolean ignoreInfeasibility = false;
+	
+	/* Arbitrary Integer Array (GA scenario) */
+	private final int[] defaultIAMapping = new int[] { 4, 1, 1, 3, 4, 0, 1, 3, 3, 0, 6, 2, 5, 6 };
+	
+	/**
+	 * Get Default IA Map
+	 * @return
+	 * 			this.defaultIAMapping
+	 */
+	public int[] getDefaultIAMapping() {
+		return this.defaultIAMapping;
+	}
+	
+	private Amalthea model;
+
+	/**
+	 * Since this method is used by RTARuntimeUtil, the visibility should be 'protected'
+	 *
+	 * @return
+	 * 			The Amalthea model object of the current CPURtaIA class
+	 */
+	public Amalthea getModel() {
+		return this.model;
+	}
+	
+	/**
+	 * Set the Amalthea model object of the current CPURtaIA class as the given Amalthea model parameter.
+	 *
+	 * @param pAmalthea			the parameter Amalthea model which would reinitialize the Amalthea model
+	 */
+	public void setModel(final Amalthea pAmalthea) {
+		this.model = pAmalthea;
+		
+		// TODO: gpuToCpuLabels, getGTCL, setGTCL, Cumulative Latency Time 
+		//setGTCL(this.model);
+	}
+	
+	private HashMap<Task, Time> trt = null;
+	
+	/**
+	 * Since this method is used by GAMapping, the visibility should be 'public'
+	 *
+	 * @return
+	 * 			trt(task with response time) HashMap variable
+	 */
+	public HashMap<Task, Time> getTRT() {
+		return this.trt;
+	}
+	
+	/**
+	 * Set the trt(task with response time) HashMap variable as the given trtp parameter variable.
+	 * Which would contains GPU tasks' response times from the beginning
+	 *
+	 * @param trtp				the HashMap variable parameter which would reinitialize the trt variable of the current CPURtaIA class.
+	 */
+	public void setTRT(final HashMap<Task, Time> trtp) {
+		this.trt = trtp;
+	}
+	
+	/**
+	 * Get the default trt(task with response time) value in case of running CPURtaIA class itself.
+	 *
+	 * @param model				the current class's Amalthea model which is used to get the trt value out of it
+	 * @return
+	 * 			the trt value which is derived out of the given parameter Amalthea model
+	 */
+	public HashMap<Task, Time> getDefaultTRT(final Amalthea model) {
+		final HashMap<Task, Time> trt = new HashMap<Task, Time>();
+		final EList<Task> allTaskList = model.getSwModel().getTasks();
+		final long val = 2000000000;
+		for (final Task t : allTaskList) {
+			if (this.gpuTaskList.contains(t)) {
+				trt.put(t, FactoryUtil.createTime(BigInteger.valueOf(val), TimeUnit.PS));
+			}
+			else {
+				trt.put(t, FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS));
+			}
+		}
+		return trt;
+	}
+	
+	private int[] tpuMapping = null;
+
+	/**
+	 * Since this method is used by RTARuntimeUtil, the visibility should be 'protected'
+	 *
+	 * @return
+	 * 			The tpuMapping integer array
+	 */
+	public int[] getIA() {
+		return this.tpuMapping;
+	}
+	
+	/**
+	 * Set the tpuMapping integer array (which would be used to modify the current task mapping to different Processing Units)
+	 * as the given tpumap parameter variable.
+	 * (The integer array would be used to modify the current task mapping to different Processing Units)
+	 *
+	 * @param tpumap			the parameter integer array which would reinitialize the tpuMapping array of the current CPURtaIA class.
+	 */
+	public void setIA(final int[] tpumap) {
+		if (tpumap == null) {
+			this.tpuMapping = null;
+		}
+		else if (tpumap.length == this.model.getSwModel().getTasks().size()) {
+			this.tpuMapping = tpumap;
+		}
+		else {
+			System.out.println("integer array size MUST match the number of tasks");
+		}
+	}
+	
+	private List<ProcessingUnit> pul = new ArrayList<>();
+
+	/**
+	 * Get a list of ProcessingUnits
+	 * 
+	 * @return
+	 * 			this.pul
+	 */
+	public List<ProcessingUnit> getPUl() {
+		return this.pul;
+	}
+	
+	/**
+	 * Set the pul, the list of Processing Units variable (which would be used to map tasks along with tpuMapping array)
+	 * as the given pul parameter variable.
+	 *
+	 * @param pul 				the parameter pul list which would reinitialize the pul list variable of the current CPURtaIA class
+	 */
+	public void setPUl(final List<ProcessingUnit> pul) {
+		this.pul = pul;
+	}
+	
+	//TODO: Contention not considered
+	private List<Task> gpuTaskList = new ArrayList<Task>();
+
+	/**
+	 * Since this method is used by RTARuntimeUtil, the visibility should be 'protected'
+	 *
+	 * @return
+	 * 			gpuTaskList which contains tasks (which are originally designed for GPU) of the Amalthea model
+	 */
+	protected List<Task> getGpuTaskList() {
+		return this.gpuTaskList;
+	}
+
+	private final List<Task> triggeringTaskList = new ArrayList<Task>();
+
+	/**
+	 * Since this method is used by RTARuntimeUtil, the visibility should be 'protected'
+	 *
+	 * @return
+	 * 			triggeringTaskList which contains tasks (which contain InterProcessTrigger) of the Amalthea model
+	 */
+	protected List<Task> getTriggeringTaskList() {
+		return this.triggeringTaskList;
+	}
+	
+	// TODO: Consider Offloading Runnable
+	
+	// TODO: Cumulative Latency Time
+	public static void main(String[] args) {
+		final CpuRTA cpurta = new CpuRTA();
+		cpurta.setModel(AmaltheaLoader.loadFromFile(cpurta.inputFile));
+		cpurta.setTRT(cpurta.getDefaultTRT(cpurta.getModel()));
+		cpurta.setIA(cpurta.defaultIAMapping);
+		cpurta.setPUl(CommonUtils.getPUs(cpurta.getModel()));
+		cpurta.run();
+	}
+	
+	/**
+	 * Executable method
+	 */
+	public void run() {
+		if (this.model == null) {
+			System.out.println("Error: No model loaded!");
+			return;
+		}
+		System.out.println("\n####################### The Test ########################\n");
+		System.out.println("RT Time Sum: " + getCPUResponseTimeSum(TimeType.WCET));
+	}
+
+	/**
+	 * Calculate the total sum of response times of the tasks of the given Amalthea model with the mapping model (tpuMapping)
+	 *
+	 * @param executionCase		BCET, ACET, WCET
+	 * @return
+	 * 			total sum of all tasks' response times of the given mapped model (tpuMapping)
+	 */
+	public Time getCPUResponseTimeSum(final TimeType executionCase) {
+		if (this.model == null) {
+			System.out.println("Error: No Model Loaded!");
+			return null;
+		}
+		else if (this.trt == null) {
+			System.out.println("Error: No HashMap Loaded!");
+			return null;
+		}
+		else if (this.tpuMapping == null) {
+			System.out.println("Error: No IntegerArray Loaded!");
+			return null;
+		}
+		else if (this.pul == null) {
+			System.out.println("Error: No PUList Loaded!");
+			return null;
+		}
+		
+		// TODO: Contention
+		Time time = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		for (int i = 0; i < this.tpuMapping.length; i++) {
+			final Time rt = getTaskCPURT(this.model.getSwModel().getTasks().get(i), executionCase);
+			if (rt.getValue().equals(BigInteger.valueOf(Long.MAX_VALUE))) {
+				// TODO: rt.getValue().equals(BigInteger.valueOf(Long.MAX_VALUE)) && !SharedConsts.ignoreInfeasibility
+				return rt;
+			}
+			time = time.add(rt);
+			if (!rt.getValue().equals(BigInteger.ZERO)) {
+				/* only put CPU tasks */
+				this.trt.put(this.model.getSwModel().getTasks().get(i), rt);
+			}
+		}
+		return time;
+	}
+	
+	/**
+	 * Calculate response time of the given task of the given Amalthea model with the mapping model (tpuMapping)
+	 *
+	 * @param task				the observed task
+	 * @param executionCase		BCET, ACET, WCET
+	 * @return
+	 * 			response time of the observed task
+	 */
+	private Time getTaskCPURT(final Task task, final TimeType executionCase) {
+		/* 1. validate thisTask is mapped to CPU */
+		final int tindex = this.model.getSwModel().getTasks().indexOf(task);
+		final int puindex = this.tpuMapping[tindex];
+		final ProcessingUnit pu = this.pul.get(puindex);
+		if (!pu.getDefinition().getPuType().equals(PuType.CPU)) {
+			System.out.println(task.getName() + " is not mapped to a CPU");
+			return FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		}
+		/* 2. get all tasks mapped to this CPU */
+		final List<Task> puTaskList = new ArrayList<Task>();
+		for (int i = 0; i < this.tpuMapping.length; i++) {
+			if (this.tpuMapping[i] == puindex) {
+				puTaskList.add(this.model.getSwModel().getTasks().get(i));
+			}
+		}
+		final List<Task> sortedTaskList = taskSorting(puTaskList);
+		return preciseTestCPURT(task, sortedTaskList, executionCase, pu);
+	}
+	
+	/**
+	 * Sort out the given list of tasks (in order of shorter period first - Rate Monotonic Scheduling)
+	 *
+	 * @param taskList			list of tasks that is mapped to the same core
+	 * @return
+	 * 			the sorted list of tasks
+	 */
+	private List<Task> taskSorting(final List<Task> taskList) {
+		/* Getting stimuliList out of the given taskList (because it is RMS) */
+		final List<Time> stimuliList = new ArrayList<>();
+		for (final Task t : taskList) {
+			stimuliList.add(CommonUtils.getStimInTime(t));
+		}
+
+		/* Sorting (Shortest Period(Time) first) */
+		Collections.sort(stimuliList, new TimeCompIA());
+		/*
+		 * Sort tasks to the newTaskList in order of Period length (shortest first
+		 * longest last)-(according to the stimuliList)
+		 */
+		final List<Task> newTaskList = new ArrayList<>();
+		for (int i = 0; i < stimuliList.size(); i++) {
+			for (final Task t : taskList) {
+				if ((!newTaskList.contains(t)) && (stimuliList.get(i).compareTo(CommonUtils.getStimInTime(t)) == 0)) {
+					newTaskList.add(t);
+				}
+			}
+		}
+		return newTaskList;
+	}
+	
+	/**
+	 * Visibility - public (This method is for the UI version code (ui package > RTApp.java))
+	 * Calculate response time of the observed task according to the periodic tasks response time analysis algorithm.
+	 *
+	 * @param task				the observed task
+	 * @param taskList			list of tasks that is mapped to the same core
+	 * @param executionCase		BCET, ACET, WCET
+	 * @param pu				ProcessingUnit that would compute the given runnable (A57 or Denver)
+	 * @return
+	 * 			response time of the observed task
+	 */
+	public Time preciseTestCPURT(final Task task, final List<Task> taskList, final TimeType executionCase, final ProcessingUnit pu) {
+		Time thisRT = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		Time period = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		if (taskList.size() == 0) {
+			System.out.println("!!! This taskList is empty so I am returning MAX !!!");
+			return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+		}
+
+		/* to check if the given task is in the taskList */
+		int flag = 0;
+		int index = 0;
+		for (int i = 0; i < taskList.size(); i++) {
+			if (task.equals(taskList.get(i))) {
+				flag = 1;
+				index = i;
+				break;
+			}
+		}
+		if (flag == 0) {
+			System.out.println("!!! Nothing in the taskList matches the given Task !!! So I am returning 0s" + " --- thisTask: " + task.getName());
+			return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+		}
+		final RuntimeUtilRTA rtaut = new RuntimeUtilRTA();
+		for (int i = 0; i < index + 1; i++) {
+			period = CommonUtils.getStimInTime(taskList.get(i));
+			if (index == 0) {
+				thisRT = rtaut.getExecutionTimeforCPUTask(taskList.get(i), pu, executionCase, this.trt, this);
+				if (thisRT.compareTo(period) <= 0) {
+					// TODO: cumulative if (thisRT.compareTo(FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS)) > 0)
+					return thisRT;
+				}
+				System.out.println("!!! This is non schedulable...!!! Because of the period " + period + " being less than the execution time of " 
+						+ thisRT + " for task " + task.getName());
+				return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+			}
+			else if (i == index) {
+				/* In the case of a COOPERATIVE Preemption typed Task */
+				if (taskList.get(i).getPreemption().equals(Preemption.COOPERATIVE)) {
+					// TODO: Blocking
+				}
+				final Time thisExeTime = rtaut.getExecutionTimeforCPUTask(taskList.get(i), pu, executionCase, this.trt, this);
+				if (thisExeTime.compareTo(FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS)) == 0) {
+					return thisExeTime;
+				}
+				else if (thisExeTime.compareTo(period) > 0) {
+					System.out.println("!!! This is non schedulable...!!! Because of the period " + period + " being less than the execution time of " 
+							+ thisRT + " for task " + task.getName());
+					return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+				}
+
+				Time culmulativeRT = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+				/* 1. add all the execution time till the index */
+				for (int j = 0; j < i + 1; j++) {
+					final Time thisTime = rtaut.getExecutionTimeforCPUTask(taskList.get(j), pu, executionCase, this.trt, this);
+					culmulativeRT = culmulativeRT.add(thisTime);
+				}
+				if (culmulativeRT.compareTo(period) <= 0) {
+					while (true) {
+						Time excepThisExeTime = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+						for (int k = 0; k < i; k++) {
+							Time localPeriod = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+							localPeriod = CommonUtils.getStimInTime(taskList.get(k));
+							final Time preExeTime = rtaut.getExecutionTimeforCPUTask(taskList.get(k), pu, executionCase, this.trt, this);
+							final double ri_period = Math.ceil(culmulativeRT.divide(localPeriod));
+							excepThisExeTime = excepThisExeTime.add(preExeTime.multiply(ri_period));
+						}
+						Time culmulativeRT_x = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+						culmulativeRT_x = thisExeTime.add(excepThisExeTime);
+						if (culmulativeRT_x.compareTo(period) <= 0) {
+							if (culmulativeRT_x.compareTo(culmulativeRT) == 0) {
+								thisRT = culmulativeRT_x;
+								// TODO: cumulative if (thisRT.compareTo(FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS)) > 0)
+								return thisRT;
+							}
+							culmulativeRT = culmulativeRT_x;
+						}
+						else {
+							System.out.println("!!! This is non schedulable...!!! Because of the period " + period
+									+ " being less than the response time (culmulativeRT_x) of " + culmulativeRT_x + " for task " + task.getName());
+							if (this.ignoreInfeasibility) {
+								return culmulativeRT_x;
+							}
+							return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+						}
+					}
+				}
+				System.out.println("!!! This is non schedulable...!!! Because of the period " + period + " being less than the response time of " 
+						+ culmulativeRT + " for task " + task.getName());
+				if (this.ignoreInfeasibility) {
+					return culmulativeRT;
+				}
+				return FactoryUtil.createTime(BigInteger.valueOf(Long.MAX_VALUE), TimeUnit.PS);
+			}
+		}
+		// TODO: cumulative if (thisRT.compareTo(FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS)) > 0)
+		return thisRT;
+	}
+	
+	/**
+	 * Visibility - public (This method is for the UI version code (ui package > RTApp.java))
+	 * It returns HashMap<Integer, List<Task>> Type reference that contains an Integer(number of Processing Unit index) and the corresponding List of Tasks
+	 * This is to visualize which task is mapped to which processing unit.
+	 * 
+	 * @return
+	 * 			HashMap<Integer, List<Task>> puListHashMap
+	 */
+	public HashMap<Integer, List<Task>> be_getPUTaskListHashMap() {
+		HashMap<Integer, List<Task>> puListHashMap = new HashMap<>();
+		final EList<Task> allTaskList = this.model.getSwModel().getTasks();
+		for(int i = 0; i < this.pul.size(); i++) {
+			final List<Task> puTaskList = new ArrayList<Task>();
+			for(int j = 0; j < this.tpuMapping.length; j++) {
+				final int puIndex = this.tpuMapping[j];
+				if (i == puIndex) {
+					puTaskList.add(allTaskList.get(j));
+				}
+			}
+			puListHashMap.put(i, taskSorting(puTaskList));
+		}
+		return puListHashMap;
+	}
+}
+
+/**
+ * @Date: June 21-2019 
+ * @author Junhyung Ki
+ * @version 1.0
+ *			This inner class is used for the method "taskSorting" to help compare between two tasks' periods (which is longer)
+ *			If the time of arg0 is shorter than that of arg1, it returns -1.
+ *			If the time of arg0 is longer than that of arg1, it returns 1.
+ */
+class TimeCompIA implements Comparator<Time> {
+	@Override
+	public int compare(final Time arg0, final Time arg1) {
+		if (arg0.compareTo(arg1) < 0) {
+			return -1;
+		}
+		return 1;
+	}
+}
\ No newline at end of file
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/RuntimeUtilRTA.java b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/RuntimeUtilRTA.java
new file mode 100644
index 0000000..10cd251
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/RuntimeUtilRTA.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Dortmund University of Applied Sciences and Arts.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors: FH Dortmund - initial API and implementation
+ * 
+ *******************************************************************************/
+package org.eclipse.app4mc.gsoc_rta;
+
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.eclipse.app4mc.amalthea.model.AmaltheaServices;
+import org.eclipse.app4mc.amalthea.model.CallSequenceItem;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.LabelAccess;
+import org.eclipse.app4mc.amalthea.model.LabelAccessEnum;
+import org.eclipse.app4mc.amalthea.model.ProcessingUnit;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.amalthea.model.Ticks;
+import org.eclipse.app4mc.amalthea.model.Time;
+import org.eclipse.app4mc.amalthea.model.TimeUnit;
+import org.eclipse.app4mc.amalthea.model.util.FactoryUtil;
+import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil;
+import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil.TimeType;
+import org.eclipse.app4mc.amalthea.model.util.SoftwareUtil;
+import org.eclipse.emf.common.util.EList;
+
+import imported.CommonUtils;
+
+/**
+ * Date: June 21-2019 
+ * @author Junhyung Ki
+ * @version 1.0
+ *					This class is to support CpuRTA class. Response Time Analysis contains low level calculation 
+ *					such as deriving execution time of a Task or Runnable. Execution time calculation varies depending on the analyzed model. 
+ *					Therefore, it is necessary to separate from Response Time calculation to increase adaptability.
+ *					Only 'getExecutionTimeforCPUTask' method is accessible for CpuRTA and the rest are sub-methods of it.
+ */
+public class RuntimeUtilRTA {
+	/**
+	 * Calculate execution time of the given task under one of the several configurations.
+	 * Since this method is used by CPURtaIA, the visibility should be 'protected'
+	 * 1. triggering task in the synchronous mode
+	 * 2. triggering task in the asynchronous mode
+	 * 3. GPU task on CPU
+	 * 4. task with only Ticks
+	 * 
+	 * @param task				the observed task
+	 * @param pu				ProcessingUnit that would compute the given runnable (A57 or Denver)
+	 * @param executionCase		BCET, ACET, WCET
+	 * @param trt				HashMap that would contain the corresponding GPU task's response time
+	 * @param cpurta			the instance of CPURtaIA class that calls this method
+	 * 							(to access to the cumuAcTime Time variable that accumulate access latency)
+	 * @return
+	 * 			execution time of the observed task
+	 */
+	protected Time getExecutionTimeforCPUTask(final Task task, final ProcessingUnit pu, final TimeType executionCase, final HashMap<Task, Time> trt, final CpuRTA cpurta) {
+		// TODO: Contention Parameter
+		/* set the default result time variable as 0s */
+		Time result = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		/* check if the current task is a triggering task.
+		 * If so, check whether or not it triggers the target task which is newly mapped to CPU.
+		 * In that case, returns 0 ps */
+		if (doesThisTaskTriggerCPUTask(task, cpurta)) {
+			return result;
+		}
+		// TODO: Contention
+		/* The list of runnables of the given task */
+		final List<Runnable> runnableList = SoftwareUtil.getRunnableList(task, null);
+		/* To identify the index of the triggerEvent */
+		final List<CallSequenceItem> callSequenceList = SoftwareUtil.collectEventsOfProcess(task, null);
+		int indexforTrigger = 0;
+		for (int i = 0; i < callSequenceList.size(); i++) {
+			if (callSequenceList.get(i) instanceof InterProcessTrigger) {
+				indexforTrigger = i;
+			}
+		}
+		/* To distinguish CPU Tasks between Sync & Async */
+		if (isTriggeringTask(task)) {
+			/* all should be synchronous (wait should not be ignored) - active wait */
+			if (cpurta.synchronousOffloading == true) {
+				result = syncTypeOperation(indexforTrigger, callSequenceList, runnableList, trt, pu, executionCase, cpurta);
+				/* if this task has the OffloadingAsync runnable, subtract the runnable part from the result */
+				// TODO: if (doesTaskHaveAsyncRunnable(task, cpurta))
+			}
+			/* all should be asynchronous (wait should be ignored) - passive wait */
+			else {
+				result = asyncTypeOperation(runnableList, pu, executionCase);
+				/* if this task is missing the OffloadingAsync runnable, add the runnable part to the result */
+				// TODO: if (!doesTaskHaveAsyncRunnable(task, cpurta))
+			}
+		}
+		else {
+			/* GPU Origin Task on CPU & No Triggering Behavior (No InterProcessTrigger) */
+			if (!(callSequenceList.get(indexforTrigger) instanceof InterProcessTrigger)) {
+				// TODO: GPU Origin task that is newly mapped to CPU
+				/* No Triggering Behavior (No InterProcessTrigger) */
+				for (final Runnable r : runnableList) {
+					result = result.add(getExecutionTimeForRTARunnable(r, pu, executionCase));
+				}
+				// TODO: result = result.add(contention);
+				return result;
+			}
+		}
+		// TODO: result = result.add(contention);
+		return result;
+	}
+
+	/**
+	 * Find out whether the given triggering task(that has an InterProcessTrigger) triggers a GPU task which is newly mapped to CPU.
+	 * If the ProcessingUnit index of the triggered task is bigger than the biggest CPU index, that means the triggered task is mapped to GPU
+	 * which would return false.
+	 * 
+	 * @param task			the observed task
+	 * @param cpurta		the instance of CPURtaIA class that calls this method
+	 * 						(to get the task List & the integer array to identify the ProcessingUnit index of the triggered task)
+	 * @return
+	 * 			boolean value (true: the observed task triggers a task that is mapped to CPU / 
+	 * 						   false: the observed task triggers a task that is mapped to GPU)
+	 */
+	private boolean doesThisTaskTriggerCPUTask(final Task task, final CpuRTA cpurta) {
+		if (cpurta.getTriggeringTaskList().contains(task)) {
+			final List<CallSequenceItem> callList = SoftwareUtil.collectEventsOfProcess(task, null);
+			final InterProcessStimulus ips = ((InterProcessTrigger) callList.stream().filter(s -> s instanceof InterProcessTrigger).iterator().next())
+					.getStimulus();
+			final EList<Task> allTaskList = cpurta.getModel().getSwModel().getTasks();
+			final int[] ia = cpurta.getIA();
+			final int cpuThreshold = CommonUtils.getNumberofCPUs(cpurta.getModel()) - 1;
+			for (int i = 0; i < ia.length; i++) {
+				if (ia[i] > cpuThreshold) {
+					final Task theTask = allTaskList.get(i);
+					if (theTask.getStimuli().get(0) instanceof InterProcessStimulus) {
+						final InterProcessStimulus thisIPS = (InterProcessStimulus) theTask.getStimuli().get(0);
+						if (ips.equals(thisIPS)) {
+							System.out.println("Confirmation: The triggered task mapped to (GPU)");
+							return false;
+						}
+					}
+				}
+			}
+			System.out.println("Confirmation: The triggered task mapped to (CPU)");
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Calculate execution time of the given runnableList in a synchronous manner.
+	 * (execution time of pre-processing) + GPU task response time + (execution time of post-processing)
+	 * 
+	 * @param indexforTrigger	Integer variable that is used to get InterProcessTrigger to identify the triggered GPU task
+	 * @param callSequenceList	callSequenceList List variable that is used to get InterProcessTrigger to identify the triggered GPU task
+	 * @param runnableList		the observed runnable List to calculate execution time in the synchronous mode
+	 * @param trt				HashMap that would contain the corresponding GPU task's response time
+	 * @param pu				ProcessingUnit that would compute the given runnable (A57 or Denver)
+	 * @param executionCase		BCET, ACET, WCET
+	 * @param cpurta			the instance of CPURtaIA class that calls this method
+	 * 							(to get the identified triggered GPU task in the model)
+	 * 							(to access to the cumuAcTime Time variable that accumulate access latency)
+	 * @return
+	 * 			synchronous execution time of the observed set
+	 */
+	private Time syncTypeOperation(final int indexforTrigger, final List<CallSequenceItem> callSequenceList, final List<Runnable> runnableList,
+			final HashMap<Task, Time> trt, final ProcessingUnit pu, final TimeType executionCase, final CpuRTA cpurta) {
+		System.out.println("TYPE: SYNC");
+		/* set the default result time variable as 0s */
+		Time result = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		/* Sum all the runnable ExecutionTime of the CPU Task */
+		for (final Runnable r : runnableList) {
+			result = result.add(getExecutionTimeForRTARunnable(r, pu, executionCase));
+		}
+		final InterProcessTrigger ipt = (InterProcessTrigger) callSequenceList.get(indexforTrigger);
+		final Task triggeredGPUTask = cpurta.getModel().getSwModel().getTasks().stream().filter(t -> t.getStimuli().get(0).equals(ipt.getStimulus())).iterator()
+				.next();
+		result = result.add(trt.get(triggeredGPUTask));
+		return result;
+	}
+
+	/**
+	 * Calculate execution time of the given runnableList in an asynchronous manner.
+	 * (execution time of pre-processing) + (execution time of post-processing) 
+	 * 
+	 * @param runnableList		the observed runnable List to calculate execution time in the asynchronous mode
+	 * @param pu				ProcessingUnit that would compute the given runnable (A57 or Denver)
+	 * @param executionCase		BCET, ACET, WCET
+	 * @return
+	 * 			asynchronous execution time of the observed runnable List
+	 */
+	private Time asyncTypeOperation(final List<Runnable> runnableList, final ProcessingUnit pu, final TimeType executionCase) {
+		System.out.println("TYPE: ASYNC");
+		/**
+		 * <Asynchronous Task> et_t=sum_{runnable calls before GPU trigger
+		 * event}et_r + et_{runnable calls after GPU trigger event};
+		 */
+		/* set the default result time variable as 0s */
+		Time result = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		/* Sum all the runnable ExecutionTime */
+		for (final Runnable r : runnableList) {
+			/* In case of Pre_Detection_Post task, the AsyncOffloading runnable is already taken into account here. */
+			result = result.add(getExecutionTimeForRTARunnable(r, pu, executionCase));
+		}
+		return result;
+	}
+
+	// TODO: getExecutionTimeForGPUTaskOnCPU
+	
+	// TODO: doesTaskHaveAsyncRunnable
+	
+	/**
+	 * Calculate execution time of the given runnable.
+	 * The method consider Read / Compute(Ticks) / Write semantic.
+	 * 
+	 * @param runnable			the observed runnable
+	 * @param pu				ProcessingUnit that would compute the given runnable (A57 or Denver)
+	 * @param executionCase		BCET, ACET, WCET
+	 * @return
+	 * 			execution time of the observed runnable
+	 */
+	private Time getExecutionTimeForRTARunnable(final Runnable runnable, final ProcessingUnit pu, final TimeType executionCase) {
+		Time result = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		final double freq = AmaltheaServices.convertToHertz(pu.getFrequencyDomain().getDefaultValue()).longValue();
+		double readLatency = 0;
+		double writeLatency = 0;
+		if (executionCase.equals(TimeType.WCET)) {
+			readLatency = pu.getAccessElements().get(0).getReadLatency().getUpperBound();
+			writeLatency = pu.getAccessElements().get(0).getWriteLatency().getUpperBound();
+		}
+		else if (executionCase.equals(TimeType.BCET)) {
+			readLatency = pu.getAccessElements().get(0).getReadLatency().getLowerBound();
+			writeLatency = pu.getAccessElements().get(0).getWriteLatency().getLowerBound();
+		}
+		else {
+			readLatency = pu.getAccessElements().get(0).getReadLatency().getAverage();
+			writeLatency = pu.getAccessElements().get(0).getWriteLatency().getAverage();
+		}
+		/* Read & Write Memory Access Time */
+		result = result.add(getRunnableMemoryAccessTime(runnable, freq, readLatency, writeLatency, executionCase));
+		
+		/* Execution (Ticks): */
+		final List<Ticks> ticksList = SoftwareUtil.getTicks(runnable, null);
+		for (final Ticks t : ticksList) {
+			final Time tickExecution = RuntimeUtil.getExecutionTimeForTicks(t, pu, executionCase);
+			result = result.add(tickExecution); // Execution(Ticks) added
+		}
+		return result;
+	}
+	
+	// TODO: getTaskMemoryAccessTime
+	
+	/**
+	 * Calculate memory access time of the observed runnable.
+	 * The method follows Read / Compute(Ticks) / Write semantic.
+	 * Read(Write)_Access_Time = Round_UP(Size_of_Read_Labels / 64.0 Bytes) * (Read_Latency / Frequency)
+	 * 
+	 * @param runnable			the observed runnable
+	 * @param frequency			frequency value of the Processing Unit
+	 * @param readLatency		readLatency value of the Processing Unit
+	 * @param writeLatency		writeLatency value of the Processing Unit
+	 * @param executionCase		BCET, ACET, WCET
+	 * @return
+	 * 			memory access time of the observed runnable
+	 */
+	private Time getRunnableMemoryAccessTime (final Runnable runnable, final double frequency, 
+			final double readLatency, final double writeLatency, final TimeType executionCase) {
+		Time result = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+		final Time parameter = FactoryUtil.createTime(BigInteger.ONE, TimeUnit.S);
+		final List<LabelAccess> thisLAList = SoftwareUtil.getLabelAccessList(runnable, null);
+		final List<LabelAccess> readList = thisLAList.stream().filter(x -> (x.getAccess()).equals(LabelAccessEnum.READ)).collect(Collectors.toList());
+		final List<LabelAccess> writeList = thisLAList.stream().filter(x -> (x.getAccess()).equals(LabelAccessEnum.WRITE)).collect(Collectors.toList());
+		/* Read (LabelAccess): */
+		double readAccessParameter = 0;
+		double sizeofReadLabels = 0;
+		for (final LabelAccess rl : readList) {
+			sizeofReadLabels += rl.getData().getSize().getNumberBytes();
+		}
+		readAccessParameter = (Math.ceil(sizeofReadLabels / 64.0) * (readLatency / frequency));
+		final Time readAccess = parameter.multiply(readAccessParameter);
+		result = result.add(readAccess); // LabelAccess(Read) added
+		
+		/* Write (LabelAccess): */
+		double writeAccessParameter = 0;
+		double sizeofWriteLabels = 0;
+		for (final LabelAccess wl : writeList) {
+			sizeofWriteLabels += wl.getData().getSize().getNumberBytes();
+		}
+		writeAccessParameter = (Math.ceil(sizeofWriteLabels / 64.0) * (writeLatency / frequency));
+		final Time writeAccess = parameter.multiply(writeAccessParameter);
+		result = result.add(writeAccess); // LabelAccess(Write) added
+		return result;
+	}
+
+	/**
+	 * Identify whether the given task has an InterProcessTrigger or not.
+	 * 
+	 * @param task			the observed task
+	 * @return
+	 * 			boolean value of the result
+	 */
+	private static boolean isTriggeringTask(final Task task) {
+		/* true: Triggering Task, false: Non-Triggering Task */
+		boolean result = false;
+		final List<CallSequenceItem> callList = SoftwareUtil.collectEventsOfProcess(task, null);
+		List<CallSequenceItem> iptList = callList.stream().filter(s -> s instanceof InterProcessTrigger).collect(Collectors.toList());
+		if (iptList.size() != 0) {
+			result = true;
+		}
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/ui/RTApp_WATERS19.java b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/ui/RTApp_WATERS19.java
new file mode 100644
index 0000000..4d9b798
--- /dev/null
+++ b/eclipse-tools/responseTime-analyzer/plugins/org.eclipse.app4mc.gsoc_rta/src/org/eclipse/app4mc/gsoc_rta/ui/RTApp_WATERS19.java
@@ -0,0 +1,561 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Dortmund University of Applied Sciences and Arts.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors: Junhyung Ki - initial API and implementation
+ * 
+ *******************************************************************************/
+package org.eclipse.app4mc.gsoc_rta.ui;
+
+import imported.CommonUtils;
+import java.awt.Color;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.List;
+import java.awt.TextArea;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashMap;
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import org.eclipse.app4mc.amalthea.model.ProcessingUnit;
+import org.eclipse.app4mc.amalthea.model.PuType;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.amalthea.model.Time;
+import org.eclipse.app4mc.amalthea.model.TimeUnit;
+import org.eclipse.app4mc.amalthea.model.io.AmaltheaLoader;
+import org.eclipse.app4mc.amalthea.model.util.FactoryUtil;
+import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil.TimeType;
+import org.eclipse.app4mc.gsoc_rta.CpuRTA;
+
+/**
+ * Date: Jun 20-2019 
+ * @author Junhyung Ki
+ * @version 1.0
+ *					The purpose of this class is to provide users a better visual and increase usability of Response Time Analysis.
+ */
+@SuppressWarnings("serial")
+public class RTApp_WATERS19 extends JFrame {
+	private HashMap<Integer, java.util.List<Task>> puTaskListHM;
+	private TimeType executionCase;
+	private JFrame frame;
+	private boolean iaEntered = false;
+	
+	/**
+	 * Launch the application.
+	 */
+	public static void main(String[] args) {
+		EventQueue.invokeLater(new Runnable() {
+			public void run() {
+				final RTApp_WATERS19 window = new RTApp_WATERS19();
+				window.frame.setVisible(true);
+				window.frame.setTitle("APP4RTA");
+			}
+		});
+	}
+
+	/**
+	 * Create the frame.
+	 */
+	public RTApp_WATERS19() {
+		initialize();
+	}
+	
+	private void initialize() {
+		final CpuRTA cpurta = new CpuRTA();
+		final ArrayList<JTextField> jTextFieldList = new ArrayList<JTextField>();
+		final ArrayList<List> tListList = new ArrayList<List>();
+		final ArrayList<List> rtListList = new ArrayList<List>();
+		
+		frame = new JFrame();
+		frame.setBounds(100, 100, 864, 690);
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.getContentPane().setLayout(null);
+		
+		JLabel lblEnterIa = new JLabel("Enter IA");
+		lblEnterIa.setBounds(32, 13, 56, 16);
+		frame.getContentPane().add(lblEnterIa);
+		
+		JButton btnDefualtIa = new JButton("Defualt IA");
+		btnDefualtIa.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				cpurta.setModel(AmaltheaLoader.loadFromFile(cpurta.inputFile));
+				cpurta.setTRT(cpurta.getDefaultTRT(cpurta.getModel()));
+				cpurta.setIA(cpurta.getDefaultIAMapping());
+				cpurta.setPUl(CommonUtils.getPUs(cpurta.getModel()));
+				final int[] defaultIA = cpurta.getIA();
+				for (int i = 0; i < defaultIA.length; i++) {
+					jTextFieldList.get(i).setText(""+defaultIA[i]);
+				}
+			}
+		});
+		btnDefualtIa.setBounds(12, 28, 97, 25);
+		frame.getContentPane().add(btnDefualtIa);
+		
+		JRadioButton rdbtnSynchronous = new JRadioButton("Synchronous");
+		rdbtnSynchronous.setBounds(157, 58, 107, 25);
+		frame.getContentPane().add(rdbtnSynchronous);
+		
+		JRadioButton rdbtnAsynchronous = new JRadioButton("Asynchronous");
+		rdbtnAsynchronous.setBounds(157, 79, 107, 25);
+		frame.getContentPane().add(rdbtnAsynchronous);
+		
+		ButtonGroup group_0 = new ButtonGroup();
+		group_0.add(rdbtnSynchronous);
+		group_0.add(rdbtnAsynchronous);
+		
+		JRadioButton rdbtnWorstCase = new JRadioButton("Worst Case");
+		rdbtnWorstCase.setBounds(268, 58, 107, 25);
+		frame.getContentPane().add(rdbtnWorstCase);
+		
+		JRadioButton rdbtnAverageCase = new JRadioButton("Average Case");
+		rdbtnAverageCase.setBounds(268, 79, 107, 25);
+		frame.getContentPane().add(rdbtnAverageCase);
+		
+		JRadioButton rdbtnBestCase = new JRadioButton("Best Case");
+		rdbtnBestCase.setBounds(268, 100, 107, 25);
+		frame.getContentPane().add(rdbtnBestCase);
+		
+		ButtonGroup group_1 = new ButtonGroup();
+		group_1.add(rdbtnWorstCase);
+		group_1.add(rdbtnAverageCase);
+		group_1.add(rdbtnBestCase);
+		
+		JButton btnEnterIA = new JButton("Enter IA");
+		btnEnterIA.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				cpurta.setModel(AmaltheaLoader.loadFromFile(cpurta.inputFile));
+				cpurta.setTRT(cpurta.getDefaultTRT(cpurta.getModel()));
+				int[] tpumap = new int[cpurta.getModel().getSwModel().getTasks().size()];
+				for (int i = 0; i < jTextFieldList.size(); i++) {
+					if ((jTextFieldList.get(i)).getText().length() == 0) {
+						JOptionPane.showMessageDialog(frame, "ERROR: Fill the rest of the array!");
+						return ;
+					}
+					else if ((jTextFieldList.get(i)).getText().charAt(0) < 48 || (jTextFieldList.get(i)).getText().charAt(0) > 54) {
+						JOptionPane.showMessageDialog(frame, "ERROR: Wrong array value!");
+						return ;
+					}
+					// TODO: should be more generic
+					else if (i >= 0 && i <= 9 && Integer.parseInt(((jTextFieldList.get(i)).getText())) == 6) {
+						JOptionPane.showMessageDialog(frame, "ERROR: CPU Tasks should not be mapped to GPU!");
+						return ;
+					}
+					// TODO: should be more generic
+					else if (i == jTextFieldList.size()-1 && Integer.parseInt(((jTextFieldList.get(i)).getText())) != 6) {
+						JOptionPane.showMessageDialog(frame, "ERROR: 'Detection' task can not be mapped to CPU!");
+						return ;
+					}
+					tpumap[i] = Integer.parseInt(((jTextFieldList.get(i)).getText()));
+				}
+				cpurta.setIA(tpumap);
+				cpurta.setPUl(CommonUtils.getPUs(cpurta.getModel()));
+				puTaskListHM = cpurta.be_getPUTaskListHashMap();
+				for (int i = 0; i < puTaskListHM.size(); i++) {
+					if (tListList.get(i).getItemCount() == 0) {
+						for (int j = 0; j < puTaskListHM.get(i).size(); j++) {	
+							tListList.get(i).add((puTaskListHM.get(i).get(j)).getName());
+						}
+					}
+				}
+				iaEntered = true;
+			}
+		});
+		btnEnterIA.setBounds(616, 28, 97, 25);
+		frame.getContentPane().add(btnEnterIA);
+		
+		JLabel lblResponseTimeSum = new JLabel("Response Time Sum");
+		lblResponseTimeSum.setBounds(616, 359, 145, 16);
+		frame.getContentPane().add(lblResponseTimeSum);
+		
+		TextArea rtSum = new TextArea();
+		rtSum.setBounds(616, 381, 218, 50);
+		frame.getContentPane().add(rtSum);
+		
+		JButton btnCalculate = new JButton("Calculate");
+		btnCalculate.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				for (int i = 0; i < jTextFieldList.size(); i++) {
+					if ((jTextFieldList.get(i)).getText().length() == 0) {
+						JOptionPane.showMessageDialog(frame, "ERROR: Fill the array first!");
+						return ;
+					}
+				}				
+				if (rdbtnSynchronous.isSelected()) {
+					cpurta.synchronousOffloading = true;
+				}
+				else if (rdbtnAsynchronous.isSelected()) {
+					cpurta.synchronousOffloading = false;
+				}
+				else {
+					JOptionPane.showMessageDialog(frame, "ERROR: You should choose an offloading mode! (Sync / Async)");
+					return ;
+				}
+				if (rdbtnWorstCase.isSelected()) {
+					executionCase = TimeType.WCET;
+				}
+				else if (rdbtnAverageCase.isSelected()) {
+					executionCase = TimeType.ACET;
+				}
+				else if (rdbtnBestCase.isSelected()) {
+					executionCase = TimeType.BCET;
+				}
+				else {
+					JOptionPane.showMessageDialog(frame, "ERROR: You should choose an execution case! (Worst Case / Average Case / Best Case)");
+					return ;
+				}
+				if (iaEntered == false) {
+					JOptionPane.showMessageDialog(frame, "ERROR: Click the 'Enter IA' button!");
+					return ;
+				}				
+				boolean flag = false;
+				Time pRtSum = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+				for (int i = 0; i < puTaskListHM.size(); i++) {
+					final ProcessingUnit pu = cpurta.getPUl().get(i);
+					final java.util.List<Task> thisPUTaskList = puTaskListHM.get(i);
+					Time thisRT = FactoryUtil.createTime(BigInteger.ZERO, TimeUnit.PS);
+					if (rtListList.get(i).getItemCount() == 0) {
+						if (pu.getDefinition().getPuType().equals(PuType.CPU)) {
+							for (Task t : thisPUTaskList) {
+								thisRT = cpurta.preciseTestCPURT(t, thisPUTaskList, executionCase, pu);
+								if (thisRT.getValue().equals(BigInteger.valueOf(Long.MAX_VALUE))) {
+									rtListList.get(i).add("Non Scheduleable! => MAX Value");
+									flag = true;
+								}
+								else {
+									rtListList.get(i).add(thisRT.toString());
+								}
+								pRtSum = pRtSum.add(thisRT);
+							}
+						}
+						else {
+							// TODO: TRT 0s!
+							for (Task t : thisPUTaskList) {
+								thisRT = cpurta.getTRT().get(t);
+								rtListList.get(i).add(thisRT.toString());
+								pRtSum = pRtSum.add(thisRT);
+							}
+						}
+					}
+				}
+				if (flag) {
+					rtSum.setText("Non Scheduleable!: " + pRtSum.toString());
+				}
+				else {
+					rtSum.setText(pRtSum.toString());
+				}
+			}
+		});
+		btnCalculate.setBounds(616, 58, 97, 25);
+		frame.getContentPane().add(btnCalculate);
+		
+		JButton btnReset = new JButton("Reset");
+		btnReset.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				cpurta.setModel(null);
+				cpurta.setTRT(null);
+				cpurta.setIA(null);
+				cpurta.setPUl(null);
+				puTaskListHM = null;
+				for (int i = 0; i < jTextFieldList.size(); i++) {
+					jTextFieldList.get(i).setText("");
+				}
+				for (List tList : tListList) {
+					tList.removeAll();
+				}
+				for (List rtList : rtListList) {
+					rtList.removeAll();
+				}
+				rtSum.setText(null);
+				iaEntered = false;
+			}
+		});
+		btnReset.setBounds(616, 86, 97, 25);
+		frame.getContentPane().add(btnReset);
+		
+		JLabel lblT0 = new JLabel("T0");
+		lblT0.setBounds(124, 13, 15, 16);
+		frame.getContentPane().add(lblT0);
+		
+		JTextField txtInput0 = new JTextField();
+		txtInput0.setBounds(124, 29, 23, 22);
+		txtInput0.setColumns(10);
+		frame.getContentPane().add(txtInput0);
+		jTextFieldList.add(txtInput0);
+		
+		JLabel lblT1 = new JLabel("T1");
+		lblT1.setBounds(159, 13, 15, 16);
+		frame.getContentPane().add(lblT1);
+		
+		JTextField txtInput1 = new JTextField();
+		txtInput1.setColumns(10);
+		txtInput1.setBounds(159, 29, 23, 22);
+		frame.getContentPane().add(txtInput1);
+		jTextFieldList.add(txtInput1);
+		
+		JLabel lblT2 = new JLabel("T2");
+		lblT2.setBounds(194, 13, 15, 16);
+		frame.getContentPane().add(lblT2);
+		
+		JTextField txtInput2 = new JTextField();
+		txtInput2.setColumns(10);
+		txtInput2.setBounds(194, 29, 23, 22);
+		frame.getContentPane().add(txtInput2);
+		jTextFieldList.add(txtInput2);
+		
+		JLabel lblT3 = new JLabel("T3");
+		lblT3.setBounds(229, 13, 15, 16);
+		frame.getContentPane().add(lblT3);
+		
+		JTextField txtInput3 = new JTextField();
+		txtInput3.setColumns(10);
+		txtInput3.setBounds(229, 29, 23, 22);
+		frame.getContentPane().add(txtInput3);
+		jTextFieldList.add(txtInput3);
+		
+		JLabel lblT4 = new JLabel("T4");
+		lblT4.setBounds(264, 13, 15, 16);
+		frame.getContentPane().add(lblT4);
+		
+		JTextField txtInput4 = new JTextField();
+		txtInput4.setColumns(10);
+		txtInput4.setBounds(264, 29, 23, 22);
+		frame.getContentPane().add(txtInput4);
+		jTextFieldList.add(txtInput4);
+		
+		JLabel lblT5 = new JLabel("T5");
+		lblT5.setBounds(299, 13, 15, 16);
+		frame.getContentPane().add(lblT5);
+		
+		JTextField txtInput5 = new JTextField();
+		txtInput5.setColumns(10);
+		txtInput5.setBounds(299, 29, 23, 22);
+		frame.getContentPane().add(txtInput5);
+		jTextFieldList.add(txtInput5);
+		
+		JLabel lblT6 = new JLabel("T6");
+		lblT6.setBounds(334, 13, 15, 16);
+		frame.getContentPane().add(lblT6);
+		
+		JTextField txtInput6 = new JTextField();
+		txtInput6.setColumns(10);
+		txtInput6.setBounds(334, 29, 23, 22);
+		frame.getContentPane().add(txtInput6);
+		jTextFieldList.add(txtInput6);
+		
+		JLabel lblT7 = new JLabel("T7");
+		lblT7.setBounds(369, 13, 15, 16);
+		frame.getContentPane().add(lblT7);
+		
+		JTextField txtInput7 = new JTextField();
+		txtInput7.setColumns(10);
+		txtInput7.setBounds(369, 29, 23, 22);
+		frame.getContentPane().add(txtInput7);
+		jTextFieldList.add(txtInput7);
+		
+		JLabel lblT8 = new JLabel("T8");
+		lblT8.setBounds(404, 13, 15, 16);
+		frame.getContentPane().add(lblT8);
+		
+		JTextField txtInput8 = new JTextField();
+		txtInput8.setColumns(10);
+		txtInput8.setBounds(404, 29, 23, 22);
+		frame.getContentPane().add(txtInput8);
+		jTextFieldList.add(txtInput8);
+		
+		JLabel lblT9 = new JLabel("T9");
+		lblT9.setBounds(439, 13, 15, 16);
+		frame.getContentPane().add(lblT9);
+		
+		JTextField txtInput9 = new JTextField();
+		txtInput9.setColumns(10);
+		txtInput9.setBounds(439, 29, 23, 22);
+		frame.getContentPane().add(txtInput9);
+		jTextFieldList.add(txtInput9);
+		
+		JLabel lblT10 = new JLabel("T10");
+		lblT10.setBounds(474, 13, 23, 16);
+		frame.getContentPane().add(lblT10);
+		
+		JTextField txtInput10 = new JTextField();
+		txtInput10.setColumns(10);
+		txtInput10.setBounds(474, 29, 23, 22);
+		frame.getContentPane().add(txtInput10);
+		jTextFieldList.add(txtInput10);
+		
+		JLabel lblT11 = new JLabel("T11");
+		lblT11.setBounds(509, 13, 23, 16);
+		frame.getContentPane().add(lblT11);
+		
+		JTextField txtInput11 = new JTextField();
+		txtInput11.setColumns(10);
+		txtInput11.setBounds(509, 29, 23, 22);
+		frame.getContentPane().add(txtInput11);
+		jTextFieldList.add(txtInput11);
+		
+		JLabel lblT12 = new JLabel("T12");
+		lblT12.setBounds(544, 13, 23, 16);
+		frame.getContentPane().add(lblT12);
+		
+		JTextField txtInput12 = new JTextField();
+		txtInput12.setColumns(10);
+		txtInput12.setBounds(544, 29, 23, 22);
+		frame.getContentPane().add(txtInput12);
+		jTextFieldList.add(txtInput12);
+		
+		JLabel lblT13 = new JLabel("T13");
+		lblT13.setBounds(579, 13, 23, 16);
+		frame.getContentPane().add(lblT13);
+		
+		JTextField txtInput13 = new JTextField();
+		txtInput13.setColumns(10);
+		txtInput13.setBounds(579, 29, 23, 22);
+		frame.getContentPane().add(txtInput13);
+		jTextFieldList.add(txtInput13);
+		
+		JLabel txtArm_0 = new JLabel("ARM0");
+		txtArm_0.setBounds(86, 154, 42, 22);
+		frame.getContentPane().add(txtArm_0);
+		
+		List arm0_list = new List();
+		arm0_list.setBounds(10, 180, 87, 145);
+		frame.getContentPane().add(arm0_list);
+		tListList.add(arm0_list);
+		
+		List arm0_rtList = new List();
+		arm0_rtList.setBounds(108, 180, 87, 145);
+		frame.getContentPane().add(arm0_rtList);
+		rtListList.add(arm0_rtList);
+		
+		JLabel txtArm_1 = new JLabel("ARM1");
+		txtArm_1.setBounds(288, 154, 42, 22);
+		frame.getContentPane().add(txtArm_1);
+		
+		List arm1_list = new List();
+		arm1_list.setBounds(212, 180, 87, 145);
+		frame.getContentPane().add(arm1_list);
+		tListList.add(arm1_list);
+		
+		List arm1_rtList = new List();
+		arm1_rtList.setBounds(309, 180, 87, 145);
+		frame.getContentPane().add(arm1_rtList);
+		rtListList.add(arm1_rtList);
+		
+		JLabel txtArm_2 = new JLabel("ARM2");
+		txtArm_2.setBounds(489, 154, 42, 22);
+		frame.getContentPane().add(txtArm_2);
+		
+		List arm2_list = new List();
+		arm2_list.setBounds(414, 180, 87, 145);
+		frame.getContentPane().add(arm2_list);
+		tListList.add(arm2_list);
+		
+		List arm2_rtList = new List();
+		arm2_rtList.setBounds(510, 180, 87, 145);
+		frame.getContentPane().add(arm2_rtList);
+		rtListList.add(arm2_rtList);
+		
+		JLabel txtArm_3 = new JLabel("ARM3");
+		txtArm_3.setBounds(691, 154, 42, 22);
+		frame.getContentPane().add(txtArm_3);
+		
+		List arm3_list = new List();
+		arm3_list.setBounds(616, 180, 87, 145);
+		frame.getContentPane().add(arm3_list);
+		tListList.add(arm3_list);
+		
+		List arm3_rtList = new List();
+		arm3_rtList.setBounds(711, 180, 87, 145);
+		frame.getContentPane().add(arm3_rtList);
+		rtListList.add(arm3_rtList);
+		
+		JLabel txtDenver_0 = new JLabel("Denver0");
+		txtDenver_0.setBounds(82, 335, 56, 22);
+		frame.getContentPane().add(txtDenver_0);
+		
+		List denver0_list = new List();
+		denver0_list.setBounds(10, 359, 87, 145);
+		frame.getContentPane().add(denver0_list);
+		tListList.add(denver0_list);
+		
+		List denver0_rtList = new List();
+		denver0_rtList.setBounds(108, 359, 87, 145);
+		frame.getContentPane().add(denver0_rtList);
+		rtListList.add(denver0_rtList);
+		
+		JLabel txtDenver_1 = new JLabel("Denver1");
+		txtDenver_1.setBounds(284, 335, 56, 22);
+		frame.getContentPane().add(txtDenver_1);
+		
+		List denver1_list = new List();
+		denver1_list.setBounds(212, 359, 87, 145);
+		frame.getContentPane().add(denver1_list);
+		tListList.add(denver1_list);
+		
+		List denver1_rtList = new List();
+		denver1_rtList.setBounds(309, 359, 87, 145);
+		frame.getContentPane().add(denver1_rtList);
+		rtListList.add(denver1_rtList);
+		
+		JLabel txtGpu = new JLabel("GPU");
+		txtGpu.setBounds(489, 335, 42, 22);
+		frame.getContentPane().add(txtGpu);
+		
+		List gpu_list = new List();
+		gpu_list.setBounds(414, 359, 87, 145);
+		frame.getContentPane().add(gpu_list);
+		tListList.add(gpu_list);
+		
+		List gpu_rtList = new List();
+		gpu_rtList.setBounds(510, 359, 87, 145);
+		frame.getContentPane().add(gpu_rtList);
+		rtListList.add(gpu_rtList);
+		
+		JLabel lblArm = new JLabel("0: ARM0");
+		lblArm.setBounds(12, 62, 56, 16);
+		frame.getContentPane().add(lblArm);
+		
+		JLabel lblArm_1 = new JLabel("1: ARM1");
+		lblArm_1.setBounds(12, 79, 56, 16);
+		frame.getContentPane().add(lblArm_1);
+		
+		JLabel lblArm_2 = new JLabel("2: ARM2");
+		lblArm_2.setBounds(12, 98, 56, 16);
+		frame.getContentPane().add(lblArm_2);
+		
+		JLabel lblArm_3 = new JLabel("3: ARM3");
+		lblArm_3.setBounds(12, 117, 56, 16);
+		frame.getContentPane().add(lblArm_3);
+		
+		JLabel lblDenver = new JLabel("4: Denver0");
+		lblDenver.setBounds(77, 62, 72, 16);
+		frame.getContentPane().add(lblDenver);
+		
+		JLabel lblDenver_1 = new JLabel("5: Denver1");
+		lblDenver_1.setBounds(77, 79, 72, 16);
+		frame.getContentPane().add(lblDenver_1);
+		
+		JLabel lblGpu = new JLabel("6: GPU");
+		lblGpu.setBounds(77, 96, 56, 16);
+		frame.getContentPane().add(lblGpu);
+		
+		JLabel lblApprta = new JLabel("APP4RTA");
+		lblApprta.setForeground(Color.BLUE);
+		lblApprta.setFont(new Font("Tahoma", Font.ITALIC, 20));
+		lblApprta.setBounds(747, 1, 87, 34);
+		frame.getContentPane().add(lblApprta);
+	}
+}
\ No newline at end of file
