diff --git a/server/__pycache__/gns3.cpython-36.pyc b/server/__pycache__/gns3.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0d46a1e4e32c07ca592b45698856de2191a0415a
Binary files /dev/null and b/server/__pycache__/gns3.cpython-36.pyc differ
diff --git a/server/__pycache__/gns3_function.cpython-36.pyc b/server/__pycache__/gns3_function.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..46863f16f95745806f9b081614b86756fe2f65da
Binary files /dev/null and b/server/__pycache__/gns3_function.cpython-36.pyc differ
diff --git a/server/client.py b/server/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..54a68463db8d52894c068a45c12cd7606d42aba3
--- /dev/null
+++ b/server/client.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import socket
+
+TCP_IP = '127.0.0.1'
+TCP_PORT = 5005
+BUFFER_SIZE = 1024
+
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.connect((TCP_IP, TCP_PORT))
+
+#print index instruction
+f = open('index_instruction.txt', 'r')
+file_contents = ''
+file_contents += f.read()
+print(file_contents)
+f.close()
+
+while 1:
+	# print('Enter index:')
+	text = ''
+	index = input()
+	while not index:
+		index = input(file_contents)
+	s.send(index.encode('utf-8'))
+	data = s.recv(BUFFER_SIZE).decode('utf-8')
+	text += data
+
+	while text.find('END') == -1:
+		data = s.recv(BUFFER_SIZE).decode('utf-8')
+		text += data
+	print(text[:-3])
+	if text[:-3] == 'close':	break
+s.close()
+
+# print("received text:", text)
\ No newline at end of file
diff --git a/server/gns3.py b/server/gns3.py
new file mode 100644
index 0000000000000000000000000000000000000000..5b4142df46a6ad8d3c1904109c6f0265c528d10a
--- /dev/null
+++ b/server/gns3.py
@@ -0,0 +1,173 @@
+import json
+import requests
+from requests.auth import HTTPBasicAuth
+
+#GNS3 Information
+
+GNS3_SERVER_ADDR = '127.0.0.1'
+GNS3_SERVER_PORT = '3080'
+GNS3_USERNAME = 'admin'
+GNS3_PASSWORD = 'cs436'
+
+
+#URL mappings
+#Copied and modified from https://gns3-server.readthedocs.io/en/latest/endpoints.html on December 17, 2018
+GNS3_URLS = {
+    #Appliance
+        'appliances': 'v2/appliances',
+        'appliance_templates': 'v2/appliances/templates',
+        'initialize_node_from_template': 'v2/projects/{project_id}/appliances/{appliance_id}',
+    #TODO 'implement' later
+    #Compute
+    #    /v2/computes
+    #    /v2/computes/endpoint/{compute_id}/{emulator}/{action:.+}
+    #    /v2/computes/{compute_id}
+    #    /v2/computes/{compute_id}/auto_idlepc
+    #    /v2/computes/{compute_id}/{emulator}/{action:.+}
+    #    /v2/computes/{compute_id}/{emulator}/images
+    #Drawing
+        'drawings': 'v2/projects/{project_id}/drawings',
+        'drawing_instance': 'v2/projects/{project_id}/drawings/{drawing_id}',
+    #Gns3 vm
+        'vm_settings': 'v2/gns3vm',
+        'vm_engines_supported': 'v2/gns3vm/engines',
+        'engine_vms_supported': '/v2/gns3vm/engines/{engine}/vms',
+    #Link
+        'links': 'v2/projects/{project_id}/links',
+        'link_instance': 'v2/projects/{project_id}/links/{link_id}',
+        'link_filters': 'v2/projects/{project_id}/links/{link_id}/available_filters',
+        'link_pcap': 'v2/projects/{project_id}/links/{link_id}/pcap',
+        'link_start_capture': 'v2/projects/{project_id}/links/{link_id}/start_capture',
+        'link_stop_capture': 'v2/projects/{project_id}/links/{link_id}/stop_capture',
+    #Node
+        'nodes': 'v2/projects/{project_id}/nodes',
+        'node_instance': 'v2/projects/{project_id}/nodes/{node_id}',
+        'duplicate_node': 'v2/projects/{project_id}/nodes/{node_id}/duplicate',
+        'compute_node_idlepc': 'v2/projects/{project_id}/nodes/{node_id}/dynamips/auto_idlepc',
+        'compute_node_potential_idlepcs': 'v2/projects/{project_id}/nodes/{node_id}/dynamips/idlepc_proposals',
+        #'node_files': 'v2/projects/{project_id}/nodes/{node_id}/files/{path:.+}',
+        'node_links': 'v2/projects/{project_id}/nodes/{node_id}/links',
+        'reload_node': 'v2/projects/{project_id}/nodes/{node_id}/reload',
+        'start_node': 'v2/projects/{project_id}/nodes/{node_id}/start',
+        'stop_node': 'v2/projects/{project_id}/nodes/{node_id}/stop',
+        'suspend_node': 'v2/projects/{project_id}/nodes/{node_id}/suspend',
+        'reload_all_nodes': 'v2/projects/{project_id}/nodes/reload',
+        'start_all_nodes': 'v2/projects/{project_id}/nodes/start',
+        'stop_all_nodes': 'v2/projects/{project_id}/nodes/stop',
+        'suspend__all_nodes': 'v2/projects/{project_id}/nodes/suspend',
+    #Project
+        'projects': 'v2/projects',
+        'load_project': 'v2/projects/load',
+        'project_instance': 'v2/projects/{project_id}',
+        'close_project': 'v2/projects/{project_id}/close',
+        'duplicate_project': '/v2/projects/{project_id}/duplicate',
+        'export_project': 'v2/projects/{project_id}/export',
+        #'access_project_file': 'v2/projects/{project_id}/files/{path:.+}',
+        'import_project': 'v2/projects/{project_id}/import',
+        'project_notifications': 'v2/projects/{project_id}/notifications',
+        'project_notifications_websocket': 'v2/projects/{project_id}/notifications/ws',
+        'open_project': 'v2/projects/{project_id}/open',
+    #Server
+        'debug': 'v2/debug',
+        'settings' : 'v2/settings', 
+        'shutdown': 'v2/shutdown', 
+        'version': 'v2/version',
+    #Snapshot
+        'all_snapshots': 'v2/projects/{project_id}/snapshots',
+        'snapshot_info': 'v2/projects/{project_id}/snapshots/{snapshot_id}',
+        'restore_snapshot': '/v2/projects/{project_id}/snapshots/{snapshot_id}/restore'
+}
+#TODO implement later?
+#Symbol
+#/v2/symbols
+#/v2/symbols/{symbol_id:.+}/raw
+
+#Generate GNS3 address for requests
+GNS3_ADDR = 'http://{0}:{1}'.format(GNS3_SERVER_ADDR, GNS3_SERVER_PORT)
+GNS3_AUTH = HTTPBasicAuth(GNS3_USERNAME, GNS3_PASSWORD)
+
+################################################################################
+##########Appliance
+################################################################################
+
+def gns3_get_appliances_list():
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['appliances']), auth=GNS3_AUTH)
+    return r.json()
+
+#TODO finish the rest
+
+################################################################################
+##########Drawing
+################################################################################
+
+def gns3_get_drawings_list(project_id):
+    drawings_url = GNS3_URLS['drawings'].format(project_id=project_id)
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, drawings_url), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_get_drawing(project_id, drawing_id):
+    drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id)
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_update_drawing(project_id, drawing_id):
+    drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id)
+    r = requests.put('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_delete_drawing(project_id, drawing_id):
+    drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id)
+    r = requests.delete('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH)
+    #TODO what do we return?
+    return r
+
+#TODO next categories
+
+################################################################################
+#########Server
+################################################################################
+
+def gns3_dump_debug_info():
+    r = requests.post('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['debug']), auth=GNS3_AUTH)
+    #TODO what do we return?
+    return r
+
+def gns3_get_settings():
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['settings']), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_shutdown_server():
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['shutdown']), auth=GNS3_AUTH)
+    #TODO what do we return?
+    return r
+
+def gns3_get_version():
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['version']), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_compare_version(version_to_compare):
+    r = requests.post('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['version']), auth=GNS3_AUTH,
+        json={'version': str(version_to_compare)})
+    return r
+
+
+################################################################################
+##########Implementation
+################################################################################
+def gns3_nodes_information(project_id):
+    url = GNS3_URLS['nodes'].format(project_id=project_id)
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r.json()
+
+def gns3_links_information(project_id):
+    url = GNS3_URLS['links'].format(project_id=project_id)
+    r = requests.get('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r.json()
+
+
+#Testing
+# print(gns3_get_version())
+# gns3_get_settings()
+# print(gns3_shutdown_server())
+# print(gns3_compare_version('2.1.12dev1'))
+# print(gns3_get_drawings_list('a'))
\ No newline at end of file
diff --git a/server/index_instruction.txt b/server/index_instruction.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8f2fc130f5d6c50a147059642e736fcb07836f69
--- /dev/null
+++ b/server/index_instruction.txt
@@ -0,0 +1,10 @@
+Provided functionality in GNS3:
+
+0: version information
+1: drawing list
+2: setting information
+3: nodes information
+4: links information
+-1: close connection
+
+Enter index:
\ No newline at end of file
diff --git a/server/server.py b/server/server.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea4d0b1851d9c230e37c6ac67bd8c40f5afcff74
--- /dev/null
+++ b/server/server.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+import socket
+import gns3
+
+
+TCP_IP = '127.0.0.1'
+TCP_PORT = 5005
+BUFFER_SIZE = 1024  # Normally 1024, but we want fast response
+project_id ='83b40958-ede6-4dec-9cff-e11bdf38bbcc'
+
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.bind((TCP_IP, TCP_PORT))
+s.listen(1)
+
+conn, addr = s.accept()
+print('Connection address:', addr)
+while 1:
+
+  index = conn.recv(BUFFER_SIZE).decode('utf-8')
+
+  if index == '0':
+    data = str(gns3.gns3_get_version())+str('END')
+
+  elif index == '1':
+    data = str(gns3.gns3_get_drawings_list(project_id))+str('END')
+
+  elif index == '2':
+    data = str(gns3.gns3_get_settings())+str('END')
+
+  elif index == '3':
+    info = gns3.gns3_nodes_information(project_id)
+    data = ''
+    for nodes in info:
+      data += str('name: ') + str(nodes.get('name')) + '\n'
+      data += str('node_id: ') + str(nodes.get('node_id')) + '\n'
+      if nodes.get('properties').get('platform'):
+        data += str('platform: ') + str(nodes.get('properties').get('platform')) + '\n'
+      data += '\n'
+    data += str('END')
+
+  elif index == '4':
+    info = gns3.gns3_links_information(project_id)
+    data = ''
+    for links in info:
+      data += str('link_id: ') + str(links.get('link_id')) + '\n'
+      nodes = links.get('nodes')
+      for node in nodes:
+        data += str('node_id: ') + str(node.get('node_id')) + '\n'
+      data += '\n'
+    data += str('END')
+
+  elif index == '-1':
+    data = str('close')+str('END')
+    conn.send(data.encode('utf-8'))  # echo
+    break
+  else:
+    data = str('incorrect msg')+str('END')
+  conn.send(data.encode('utf-8'))  # echo
+
+conn.close()
+