diff --git a/.gitignore b/.gitignore
index 6793308750e93c4ce9e026bec63fb6bd8071ed32..5bba7af96e75af65b1cc95fc52a50ab820d9986e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ __pycache__/
 .idea/
 venv/
 .DS_Store
+**.egg-info/
\ No newline at end of file
diff --git a/demo.py b/demo.py
index c0a62d944dda4dd3f13f2920330e195483d36223..c27601c91de525ff1d74f0ab1d100874a7315950 100644
--- a/demo.py
+++ b/demo.py
@@ -1,8 +1,8 @@
-from src.example.example_agent.car_agent import CarAgent
-from src.scene_verifier.scenario.scenario import Scenario
-from src.example.example_map.simple_map2 import SimpleMap2, SimpleMap3, SimpleMap5, SimpleMap6
-from src.plotter.plotter2D import *
-from src.example.example_sensor.fake_sensor import FakeSensor2
+from dryvrpy.example.example_agent.car_agent import CarAgent
+from dryvrpy.scene_verifier.scenario.scenario import Scenario
+from dryvrpy.example.example_map.simple_map2 import SimpleMap2, SimpleMap3, SimpleMap5, SimpleMap6
+from dryvrpy.plotter.plotter2D import *
+from dryvrpy.example.example_sensor.fake_sensor import FakeSensor2
 
 import matplotlib.pyplot as plt
 import numpy as np
@@ -51,16 +51,16 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane1),
         ]
     )
-    res_list = scenario.simulate_multi(40,1)
-    # traces = scenario.verify(40)
+    # res_list = scenario.simulate_multi(40,1)
+    traces = scenario.verify(40)
 
-    # fig = plt.figure(2)
-    # fig,x_lim,y_lim = plot_map(tmp_map, 'g', fig)
-    # fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
-    # fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
-    for traces in res_list:
-        generate_simulation_anime(traces, tmp_map)
-        # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car1', 1, [2], 'b', fig,x_lim,y_lim)
-        # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car2', 1, [2], 'r', fig,x_lim,y_lim)
+    fig = plt.figure(2)
+    fig = plot_map(tmp_map, 'g', fig)
+    fig = plot_reachtube_tree(traces, 'car1', 1, [2], 'b', fig)
+    fig = plot_reachtube_tree(traces, 'car2', 1, [2], 'r', fig)
+    # for traces in res_list:
+    #     generate_simulation_anime(traces, tmp_map)
+    #     # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car1', 1, [2], 'b', fig,x_lim,y_lim)
+    #     # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car2', 1, [2], 'r', fig,x_lim,y_lim)
 
     plt.show()
diff --git a/demo2.py b/demo2.py
index 4ec0bec812a8615dcfc1353dd710cce679a32b44..795e150833bdd3579f79ff05dd7d61dfac60a9b6 100644
--- a/demo2.py
+++ b/demo2.py
@@ -1,8 +1,8 @@
-from src.example.example_agent.car_agent import CarAgent, NPCAgent
-from src.scene_verifier.scenario.scenario import Scenario
-from src.example.example_map.simple_map2 import SimpleMap2, SimpleMap3, SimpleMap5, SimpleMap6
-from src.plotter.plotter2D import *
-from src.example.example_sensor.fake_sensor import FakeSensor2
+from dryvrpy.example.example_agent.car_agent import CarAgent, NPCAgent
+from dryvrpy.scene_verifier.scenario.scenario import Scenario
+from dryvrpy.example.example_map.simple_map2 import SimpleMap2, SimpleMap3, SimpleMap5, SimpleMap6
+from dryvrpy.plotter.plotter2D import *
+from dryvrpy.example.example_sensor.fake_sensor import FakeSensor2
 
 import matplotlib.pyplot as plt
 import numpy as np
@@ -51,17 +51,17 @@ if __name__ == "__main__":
             (VehicleMode.Normal, LaneMode.Lane1),
         ]
     )
-    res_list = scenario.simulate_multi(10,1)
-    # traces = scenario.verify(10)
+    # res_list = scenario.simulate_multi(10,10)
+    traces = scenario.verify(10)
 
-    # fig = plt.figure(2)
-    # fig,x_lim,y_lim = plot_map(tmp_map, 'g', fig)
-    # fig,x_lim,y_lim = plot_reachtube_tree(traces, 'car1', 0, [1], 'b', fig)
-    # fig,x_lim,y_lim = plot_reachtube_tree(traces, 'car2', 0, [1], 'r', fig,x_lim,y_lim)
-    for traces in res_list:
-        # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car1', 0, [1], 'b', fig)
-        # fig,x_lim,y_lim = plot_simulation_tree(traces, 'car2', 0, [1], 'r', fig, x_lim, y_lim)
-        generate_simulation_anime(traces, tmp_map)
+    fig = plt.figure(2)
+    # fig = plot_map(tmp_map, 'g', fig)
+    fig = plot_reachtube_tree(traces, 'car1', 0, [1], 'b', fig, (1000,-1000), (1000,-1000))
+    fig = plot_reachtube_tree(traces, 'car2', 0, [1], 'r', fig)
+    # for traces in res_list:
+    #     fig = plot_simulation_tree(traces, 'car1', 0, [1], 'b', fig, (1000,-1000), (1000,-1000))
+    #     fig = plot_simulation_tree(traces, 'car2', 0, [1], 'r', fig)
+    #     # generate_simulation_anime(traces, tmp_map)
 
 
 
diff --git a/src/__init__.py b/dryvr_plus_plus/__init__.py
similarity index 100%
rename from src/__init__.py
rename to dryvr_plus_plus/__init__.py
diff --git a/src/example/__init__.py b/dryvr_plus_plus/example/__init__.py
similarity index 100%
rename from src/example/__init__.py
rename to dryvr_plus_plus/example/__init__.py
diff --git a/src/example/example_agent/__init__.py b/dryvr_plus_plus/example/example_agent/__init__.py
similarity index 100%
rename from src/example/example_agent/__init__.py
rename to dryvr_plus_plus/example/example_agent/__init__.py
diff --git a/src/example/example_agent/car_agent.py b/dryvr_plus_plus/example/example_agent/car_agent.py
similarity index 97%
rename from src/example/example_agent/car_agent.py
rename to dryvr_plus_plus/example/example_agent/car_agent.py
index cd7e94c25c4b8e740f46aa86c53111a37bf13022..8079e4b62137f3299175ca9a8462c193e8edca17 100644
--- a/src/example/example_agent/car_agent.py
+++ b/dryvr_plus_plus/example/example_agent/car_agent.py
@@ -3,8 +3,8 @@ from typing import Tuple, List
 import numpy as np 
 from scipy.integrate import ode
 
-from src.scene_verifier.agents.base_agent import BaseAgent
-from src.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.agents.base_agent import BaseAgent
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
 
 class NPCAgent(BaseAgent):
     def __init__(self, id, code = None, file_name = None):
diff --git a/src/example/example_agent/sign_agent.py b/dryvr_plus_plus/example/example_agent/sign_agent.py
similarity index 88%
rename from src/example/example_agent/sign_agent.py
rename to dryvr_plus_plus/example/example_agent/sign_agent.py
index fe7af49971668afdc7a03ab8399250ad1c6bb3c3..c9fa9c1b59733349b26961ec7d41dff3e5cec09d 100644
--- a/src/example/example_agent/sign_agent.py
+++ b/dryvr_plus_plus/example/example_agent/sign_agent.py
@@ -1,4 +1,4 @@
-from src.scene_verifier.agents.base_agent import BaseAgent
+from dryvrpy.scene_verifier.agents.base_agent import BaseAgent
 import numpy as np
 
 class SignAgent(BaseAgent):
diff --git a/src/example/example_map/__init__.py b/dryvr_plus_plus/example/example_map/__init__.py
similarity index 100%
rename from src/example/example_map/__init__.py
rename to dryvr_plus_plus/example/example_map/__init__.py
diff --git a/src/example/example_map/simple_map.py b/dryvr_plus_plus/example/example_map/simple_map.py
similarity index 89%
rename from src/example/example_map/simple_map.py
rename to dryvr_plus_plus/example/example_map/simple_map.py
index 1ebe33d045455adb5a01d0ff39577cb99e058f99..dca317775e33945c4aede10845274850ccb5b0bf 100644
--- a/src/example/example_map/simple_map.py
+++ b/dryvr_plus_plus/example/example_map/simple_map.py
@@ -1,5 +1,5 @@
-from src.scene_verifier.map.lane_map import LaneMap
-from src.scene_verifier.map.lane_segment import LaneSegment
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_segment import LaneSegment
 
 class SimpleMap(LaneMap):
     def __init__(self):
diff --git a/src/example/example_map/simple_map2.py b/dryvr_plus_plus/example/example_map/simple_map2.py
similarity index 95%
rename from src/example/example_map/simple_map2.py
rename to dryvr_plus_plus/example/example_map/simple_map2.py
index b23d73ed2089b0cbbf7e0326e439610cb51bd60e..ce5ffc214f1c3c028a1960ff0c3ef17adaa8dbd4 100644
--- a/src/example/example_map/simple_map2.py
+++ b/dryvr_plus_plus/example/example_map/simple_map2.py
@@ -1,6 +1,6 @@
-from src.scene_verifier.map.lane_map import LaneMap
-from src.scene_verifier.map.lane_segment import LaneSegment, StraightLane, CircularLane
-from src.scene_verifier.map.lane import Lane
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_segment import LaneSegment, StraightLane, CircularLane
+from dryvrpy.scene_verifier.map.lane import Lane
 
 import numpy as np
 
diff --git a/src/example/example_sensor/__init__.py b/dryvr_plus_plus/example/example_sensor/__init__.py
similarity index 100%
rename from src/example/example_sensor/__init__.py
rename to dryvr_plus_plus/example/example_sensor/__init__.py
diff --git a/src/example/example_sensor/fake_sensor.py b/dryvr_plus_plus/example/example_sensor/fake_sensor.py
similarity index 100%
rename from src/example/example_sensor/fake_sensor.py
rename to dryvr_plus_plus/example/example_sensor/fake_sensor.py
diff --git a/src/plotter/__init__.py b/dryvr_plus_plus/plotter/__init__.py
similarity index 100%
rename from src/plotter/__init__.py
rename to dryvr_plus_plus/plotter/__init__.py
diff --git a/src/plotter/parser.py b/dryvr_plus_plus/plotter/parser.py
similarity index 100%
rename from src/plotter/parser.py
rename to dryvr_plus_plus/plotter/parser.py
diff --git a/src/plotter/plotter2D.py b/dryvr_plus_plus/plotter/plotter2D.py
similarity index 87%
rename from src/plotter/plotter2D.py
rename to dryvr_plus_plus/plotter/plotter2D.py
index a89c77c1357d47e79b1b7b8219e9214e7451791a..68364c7d1eba3c33048a8af70b9e81bb5f40fdd2 100644
--- a/src/plotter/plotter2D.py
+++ b/dryvr_plus_plus/plotter/plotter2D.py
@@ -17,12 +17,18 @@ def plot(
     y_dim_list: List[int] = [1], 
     color = 'b', 
     fig = None, 
-    x_lim = (float('inf'), -float('inf')), 
-    y_lim = (float('inf'), -float('inf'))
+    x_lim = None, 
+    y_lim = None
 ):
     if fig is None:
         fig = plt.figure()
+    
     ax = fig.gca()
+    if x_lim is None:
+        x_lim = ax.get_xlim()
+    if y_lim is None:
+        y_lim = ax.get_ylim()
+    
     x_min, x_max = x_lim
     y_min, y_max = y_lim
     for rect in data:
@@ -40,10 +46,16 @@ def plot(
     ax.set_ylim([y_min-1, y_max+1])
     return fig, (x_min, x_max), (y_min, y_max)
 
-def plot_reachtube_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1], color='b', fig = None, x_lim = (float('inf'),-float('inf')),y_lim = (float('inf'),-float('inf'))):
+def plot_reachtube_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1], color='b', fig = None, x_lim = None, y_lim = None):
     if fig is None:
         fig = plt.figure()
+    
     ax = fig.gca()
+    if x_lim is None:
+        x_lim = ax.get_xlim()
+    if y_lim is None:
+        y_lim = ax.get_ylim()
+
     queue = [root]
     while queue != []:
         node = queue.pop(0)
@@ -56,12 +68,18 @@ def plot_reachtube_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1],
 
         queue += node.child
 
-    return fig,x_lim,y_lim
+    return fig
 
-def plot_map(map, color = 'b', fig = None, x_lim = (float('inf'),-float('inf')),y_lim = (float('inf'),-float('inf'))):
+def plot_map(map, color = 'b', fig = None, x_lim = None,y_lim = None):
     if fig is None:
         fig = plt.figure()
+    
     ax = fig.gca()
+    if x_lim is None:
+        x_lim = ax.get_xlim()
+    if y_lim is None:
+        y_lim = ax.get_ylim()
+
     for lane_idx in map.lane_dict:
         lane = map.lane_dict[lane_idx]
         for lane_seg in lane.segment_list:
@@ -74,12 +92,18 @@ def plot_map(map, color = 'b', fig = None, x_lim = (float('inf'),-float('inf')),
                 ax.plot(x,y,color)
             else:
                 raise ValueError(f'Unknown lane segment type {lane_seg.type}')
-    return fig, ax.get_xlim(), ax.get_ylim()
+    return fig
 
-def plot_simulation_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1], color='b', fig = None, x_lim = (float('inf'),-float('inf')),y_lim = (float('inf'),-float('inf'))):
+def plot_simulation_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1], color='b', fig = None, x_lim = None, y_lim = None):
     if fig is None:
         fig = plt.figure()
+    
     ax = fig.gca()
+    if x_lim is None:
+        x_lim = ax.get_xlim()
+    if y_lim is None:
+        y_lim = ax.get_ylim()
+    
     x_min, x_max = x_lim
     y_min, y_max = y_lim
     
@@ -100,7 +124,7 @@ def plot_simulation_tree(root, agent_id, x_dim: int=0, y_dim_list: List[int]=[1]
     ax.set_xlim([x_min-1, x_max+1])
     ax.set_ylim([y_min-1, y_max+1])
     
-    return fig, ax.get_xlim(), ax.get_ylim()
+    return fig
 
 def generate_simulation_anime(root, map):
     timed_point_dict = {}
diff --git a/src/plotter/plotter3D.py b/dryvr_plus_plus/plotter/plotter3D.py
similarity index 100%
rename from src/plotter/plotter3D.py
rename to dryvr_plus_plus/plotter/plotter3D.py
diff --git a/src/scene_verifier/__init__.py b/dryvr_plus_plus/scene_verifier/__init__.py
similarity index 100%
rename from src/scene_verifier/__init__.py
rename to dryvr_plus_plus/scene_verifier/__init__.py
diff --git a/src/scene_verifier/agents/__init__.py b/dryvr_plus_plus/scene_verifier/agents/__init__.py
similarity index 100%
rename from src/scene_verifier/agents/__init__.py
rename to dryvr_plus_plus/scene_verifier/agents/__init__.py
diff --git a/src/scene_verifier/agents/base_agent.py b/dryvr_plus_plus/scene_verifier/agents/base_agent.py
similarity index 77%
rename from src/scene_verifier/agents/base_agent.py
rename to dryvr_plus_plus/scene_verifier/agents/base_agent.py
index e0044528e0c7ce5c0d0119b932d049c8d65b4802..ef0ec62717e0ff2068634811518ce687dc62005e 100644
--- a/src/scene_verifier/agents/base_agent.py
+++ b/dryvr_plus_plus/scene_verifier/agents/base_agent.py
@@ -1,4 +1,4 @@
-from src.scene_verifier.code_parser.pythonparser import ControllerAst
+from dryvrpy.scene_verifier.code_parser.pythonparser import ControllerAst
 
 class BaseAgent:
     def __init__(self, id, code = None, file_name = None):  
diff --git a/src/scene_verifier/analysis/__init__.py b/dryvr_plus_plus/scene_verifier/analysis/__init__.py
similarity index 100%
rename from src/scene_verifier/analysis/__init__.py
rename to dryvr_plus_plus/scene_verifier/analysis/__init__.py
diff --git a/src/scene_verifier/analysis/analysis_tree_node.py b/dryvr_plus_plus/scene_verifier/analysis/analysis_tree_node.py
similarity index 100%
rename from src/scene_verifier/analysis/analysis_tree_node.py
rename to dryvr_plus_plus/scene_verifier/analysis/analysis_tree_node.py
diff --git a/src/scene_verifier/analysis/simulator.py b/dryvr_plus_plus/scene_verifier/analysis/simulator.py
similarity index 94%
rename from src/scene_verifier/analysis/simulator.py
rename to dryvr_plus_plus/scene_verifier/analysis/simulator.py
index 95532b12292077b9f5878d98bd5cc4bf86ea8aee..a112ab329a35731fc932bb602a09665e900a5f36 100644
--- a/src/scene_verifier/analysis/simulator.py
+++ b/dryvr_plus_plus/scene_verifier/analysis/simulator.py
@@ -3,8 +3,8 @@ import copy
 
 import numpy as np
 
-from src.scene_verifier.agents.base_agent import BaseAgent
-from src.scene_verifier.analysis.analysis_tree_node import AnalysisTreeNode
+from dryvrpy.scene_verifier.agents.base_agent import BaseAgent
+from dryvrpy.scene_verifier.analysis.analysis_tree_node import AnalysisTreeNode
 
 class Simulator:
     def __init__(self):
@@ -22,9 +22,7 @@ class Simulator:
         )
         for i, agent in enumerate(agent_list):
             root.init[agent.id] = init_list[i]
-            init_mode = init_mode_list[i][0].name
-            for j in range(1, len(init_mode_list[i])):
-                init_mode += (','+init_mode_list[i][j].name)
+            init_mode = [elem.name for elem in init_mode_list[i]]
             root.mode[agent.id] = init_mode
             root.agent[agent.id] = agent
             root.type = 'simtrace'
diff --git a/src/scene_verifier/analysis/verifier.py b/dryvr_plus_plus/scene_verifier/analysis/verifier.py
similarity index 94%
rename from src/scene_verifier/analysis/verifier.py
rename to dryvr_plus_plus/scene_verifier/analysis/verifier.py
index 6854579bf94b851458f4f586be14e43c8728859d..0135cf6ec68f319c25fd4371a238381544737331 100644
--- a/src/scene_verifier/analysis/verifier.py
+++ b/dryvr_plus_plus/scene_verifier/analysis/verifier.py
@@ -3,10 +3,10 @@ import copy
 
 import numpy as np
 
-from src.scene_verifier.agents.base_agent import BaseAgent
-from src.scene_verifier.analysis.analysis_tree_node import AnalysisTreeNode
-from src.scene_verifier.dryvr.core.dryvrcore import calc_bloated_tube
-import src.scene_verifier.dryvr.common.config as userConfig
+from dryvrpy.scene_verifier.agents.base_agent import BaseAgent
+from dryvrpy.scene_verifier.analysis.analysis_tree_node import AnalysisTreeNode
+from dryvrpy.scene_verifier.dryvr.core.dryvrcore import calc_bloated_tube
+import dryvrpy.scene_verifier.dryvr.common.config as userConfig
 
 class Verifier:
     def __init__(self):
diff --git a/src/scene_verifier/automaton/__init__.py b/dryvr_plus_plus/scene_verifier/automaton/__init__.py
similarity index 100%
rename from src/scene_verifier/automaton/__init__.py
rename to dryvr_plus_plus/scene_verifier/automaton/__init__.py
diff --git a/src/scene_verifier/automaton/guard.py b/dryvr_plus_plus/scene_verifier/automaton/guard.py
similarity index 99%
rename from src/scene_verifier/automaton/guard.py
rename to dryvr_plus_plus/scene_verifier/automaton/guard.py
index b3a2ebe7ee0ec68c2e7b02e79ba57f8b6b848bba..4e7202c3c2f2df496fcd6e4e7e30bf518d3d4368 100644
--- a/src/scene_verifier/automaton/guard.py
+++ b/dryvr_plus_plus/scene_verifier/automaton/guard.py
@@ -12,9 +12,9 @@ import sympy
 import astunparse
 import numpy as np
 
-from src.scene_verifier.map.lane_map import LaneMap
-from src.scene_verifier.map.lane_segment import AbstractLane
-from src.scene_verifier.utils.utils import *
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_segment import AbstractLane
+from dryvrpy.scene_verifier.utils.utils import *
 class LogicTreeNode:
     def __init__(self, data, child = [], val = None, mode_guard = None):
         self.data = data 
diff --git a/src/scene_verifier/automaton/hybrid_automaton.py b/dryvr_plus_plus/scene_verifier/automaton/hybrid_automaton.py
similarity index 100%
rename from src/scene_verifier/automaton/hybrid_automaton.py
rename to dryvr_plus_plus/scene_verifier/automaton/hybrid_automaton.py
diff --git a/src/scene_verifier/automaton/hybrid_io_automaton.py b/dryvr_plus_plus/scene_verifier/automaton/hybrid_io_automaton.py
similarity index 90%
rename from src/scene_verifier/automaton/hybrid_io_automaton.py
rename to dryvr_plus_plus/scene_verifier/automaton/hybrid_io_automaton.py
index 74f2c963c7ec16095d2ecbc846da58a21e336702..44d074777da46883ebc59e222ffc6c4ceed265b4 100644
--- a/src/scene_verifier/automaton/hybrid_io_automaton.py
+++ b/dryvr_plus_plus/scene_verifier/automaton/hybrid_io_automaton.py
@@ -1,4 +1,4 @@
-from src.scene_verifier.automaton.hybrid_automaton import HybridAutomaton
+from dryvrpy.scene_verifier.automaton.hybrid_automaton import HybridAutomaton
 
 class HybridIoAutomaton(HybridAutomaton):
     def __init__(
diff --git a/src/scene_verifier/automaton/reset.py b/dryvr_plus_plus/scene_verifier/automaton/reset.py
similarity index 100%
rename from src/scene_verifier/automaton/reset.py
rename to dryvr_plus_plus/scene_verifier/automaton/reset.py
diff --git a/src/scene_verifier/code_parser/__init__.py b/dryvr_plus_plus/scene_verifier/code_parser/__init__.py
similarity index 100%
rename from src/scene_verifier/code_parser/__init__.py
rename to dryvr_plus_plus/scene_verifier/code_parser/__init__.py
diff --git a/src/scene_verifier/code_parser/pythonparser.py b/dryvr_plus_plus/scene_verifier/code_parser/pythonparser.py
similarity index 100%
rename from src/scene_verifier/code_parser/pythonparser.py
rename to dryvr_plus_plus/scene_verifier/code_parser/pythonparser.py
diff --git a/src/scene_verifier/dryvr/__init__.py b/dryvr_plus_plus/scene_verifier/dryvr/__init__.py
similarity index 100%
rename from src/scene_verifier/dryvr/__init__.py
rename to dryvr_plus_plus/scene_verifier/dryvr/__init__.py
diff --git a/src/scene_verifier/dryvr/common/__init__.py b/dryvr_plus_plus/scene_verifier/dryvr/common/__init__.py
similarity index 100%
rename from src/scene_verifier/dryvr/common/__init__.py
rename to dryvr_plus_plus/scene_verifier/dryvr/common/__init__.py
diff --git a/src/scene_verifier/dryvr/common/config.py b/dryvr_plus_plus/scene_verifier/dryvr/common/config.py
similarity index 100%
rename from src/scene_verifier/dryvr/common/config.py
rename to dryvr_plus_plus/scene_verifier/dryvr/common/config.py
diff --git a/src/scene_verifier/dryvr/common/constant.py b/dryvr_plus_plus/scene_verifier/dryvr/common/constant.py
similarity index 100%
rename from src/scene_verifier/dryvr/common/constant.py
rename to dryvr_plus_plus/scene_verifier/dryvr/common/constant.py
diff --git a/src/scene_verifier/dryvr/common/io.py b/dryvr_plus_plus/scene_verifier/dryvr/common/io.py
similarity index 97%
rename from src/scene_verifier/dryvr/common/io.py
rename to dryvr_plus_plus/scene_verifier/dryvr/common/io.py
index bf864448b0ab522a1f5e17df03d67e2be0512390..c0662420c8617c665537d1fe250d556e9903cf21 100644
--- a/src/scene_verifier/dryvr/common/io.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/common/io.py
@@ -4,7 +4,7 @@ This file contains IO functions for DryVR
 
 import six
 
-from src.scene_verifier.dryvr.common.utils import DryVRInput, RrtInput, checkVerificationInput, checkSynthesisInput
+from dryvrpy.scene_verifier.dryvr.common.utils import DryVRInput, RrtInput, checkVerificationInput, checkSynthesisInput
 
 
 def writeReachTubeFile(result, path):
diff --git a/src/scene_verifier/dryvr/common/utils.py b/dryvr_plus_plus/scene_verifier/dryvr/common/utils.py
similarity index 100%
rename from src/scene_verifier/dryvr/common/utils.py
rename to dryvr_plus_plus/scene_verifier/dryvr/common/utils.py
diff --git a/src/scene_verifier/dryvr/core/__init__.py b/dryvr_plus_plus/scene_verifier/dryvr/core/__init__.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/__init__.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/__init__.py
diff --git a/src/scene_verifier/dryvr/core/distance.py b/dryvr_plus_plus/scene_verifier/dryvr/core/distance.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/distance.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/distance.py
diff --git a/src/scene_verifier/dryvr/core/dryvrcore.py b/dryvr_plus_plus/scene_verifier/dryvr/core/dryvrcore.py
similarity index 94%
rename from src/scene_verifier/dryvr/core/dryvrcore.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/dryvrcore.py
index dfdefb7395e7b4a0b1de4cabdba083da509fc303..188e1e6b0fc5e1ed39bd920d95a06918cd7be8d3 100644
--- a/src/scene_verifier/dryvr/core/dryvrcore.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/dryvrcore.py
@@ -9,10 +9,10 @@ import numpy as np
 import igraph
 
 
-from src.scene_verifier.dryvr.common.constant import *
-from src.scene_verifier.dryvr.common.io import writeReachTubeFile
-from src.scene_verifier.dryvr.common.utils import randomPoint, calcDelta, calcCenterPoint, trimTraces
-from src.scene_verifier.dryvr.discrepancy.Global_Disc import get_reachtube_segment
+from dryvrpy.scene_verifier.dryvr.common.constant import *
+from dryvrpy.scene_verifier.dryvr.common.io import writeReachTubeFile
+from dryvrpy.scene_verifier.dryvr.common.utils import randomPoint, calcDelta, calcCenterPoint, trimTraces
+from dryvrpy.scene_verifier.dryvr.discrepancy.Global_Disc import get_reachtube_segment
 # from scene_verifier.dryvr.tube_computer.backend.reachabilityengine import ReachabilityEngine
 # from scene_verifier.dryvr.tube_computer.backend.initialset import InitialSet
 
@@ -134,9 +134,9 @@ def simulate(g, init_condition, time_horizon, guard, sim_func, reset, init_verte
         g (obj): graph object
         init_condition (list): initial point
         time_horizon (float): time horizon to simulate
-        guard (src.core.guard.Guard): list of guard string corresponding to each transition
+        guard (dryvr_plus_plus.core.guard.Guard): list of guard string corresponding to each transition
         sim_func (function): simulation function
-        reset (src.core.reset.Reset): list of reset corresponding to each transition
+        reset (dryvr_plus_plus.core.reset.Reset): list of reset corresponding to each transition
         init_vertex (int): initial vertex that simulation starts
         deterministic (bool) : enable or disable must transition
 
@@ -264,7 +264,7 @@ def calc_bloated_tube(
         bloating_method (str): determine the bloating method for reach tube, either GLOBAL or PW
         sim_trace_num (int): number of simulations used to calculate the discrepancy
         kvalue (list): list of float used when bloating method set to PW
-        guard_checker (src.core.guard.Guard or None): guard check object
+        guard_checker (dryvr_plus_plus.core.guard.Guard or None): guard check object
         guard_str (str): guard string
        
     Returns:
diff --git a/src/scene_verifier/dryvr/core/dryvrmain.py b/dryvr_plus_plus/scene_verifier/dryvr/core/dryvrmain.py
similarity index 96%
rename from src/scene_verifier/dryvr/core/dryvrmain.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/dryvrmain.py
index 7b085aab083f01e9af8b9fe52bd82857493d544c..7b0fc072627f2494f940305e2fc97c574c708c27 100644
--- a/src/scene_verifier/dryvr/core/dryvrmain.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/dryvrmain.py
@@ -4,21 +4,21 @@ This file contains a single function that verifies model
 from __future__ import print_function
 import time
 
-import src.common.config as userConfig
-from src.common.io import parseVerificationInputFile, parseRrtInputFile, writeRrtResultFile
-from src.common.utils import buildModeStr, isIpynb, overloadConfig
-from src.core.distance import DistChecker
-from src.core.dryvrcore import *
-from src.core.goalchecker import GoalChecker
-from src.core.graph import Graph
-from src.core.guard import Guard
-from src.core.initialset import InitialSet
-from src.core.initialsetstack import InitialSetStack, GraphSearchNode
-from src.core.reachtube import ReachTube
-from src.core.reset import Reset
-from src.core.uniformchecker import UniformChecker
-# from src.tube_computer.backend.reachabilityengine import ReachabilityEngine
-# from src.tube_computer.backend.initialset import InitialSet
+import dryvrpy.common.config as userConfig
+from dryvrpy.common.io import parseVerificationInputFile, parseRrtInputFile, writeRrtResultFile
+from dryvrpy.common.utils import buildModeStr, isIpynb, overloadConfig
+from dryvrpy.core.distance import DistChecker
+from dryvrpy.core.dryvrcore import *
+from dryvrpy.core.goalchecker import GoalChecker
+from dryvrpy.core.graph import Graph
+from dryvrpy.core.guard import Guard
+from dryvrpy.core.initialset import InitialSet
+from dryvrpy.core.initialsetstack import InitialSetStack, GraphSearchNode
+from dryvrpy.core.reachtube import ReachTube
+from dryvrpy.core.reset import Reset
+from dryvrpy.core.uniformchecker import UniformChecker
+# from dryvr_plus_plus.tube_computer.backend.reachabilityengine import ReachabilityEngine
+# from dryvr_plus_plus.tube_computer.backend.initialset import InitialSet
 
 def verify(data, sim_function, param_config=None):
     """
diff --git a/src/scene_verifier/dryvr/core/goalchecker.py b/dryvr_plus_plus/scene_verifier/dryvr/core/goalchecker.py
similarity index 98%
rename from src/scene_verifier/dryvr/core/goalchecker.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/goalchecker.py
index ba84296c159c2d102123179eb75a5cb640e71dcc..93c354eb336b4c66f6d33cb78e205ebaa4254235 100644
--- a/src/scene_verifier/dryvr/core/goalchecker.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/goalchecker.py
@@ -2,7 +2,7 @@
 This file contains uniform checker class for DryVR
 """
 
-from src.common.utils import handleReplace, neg
+from dryvrpy.common.utils import handleReplace, neg
 from z3 import *
 
 
diff --git a/src/scene_verifier/dryvr/core/graph.py b/dryvr_plus_plus/scene_verifier/dryvr/core/graph.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/graph.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/graph.py
diff --git a/src/scene_verifier/dryvr/core/guard.py b/dryvr_plus_plus/scene_verifier/dryvr/core/guard.py
similarity index 99%
rename from src/scene_verifier/dryvr/core/guard.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/guard.py
index 76e7e8238defec4aaa34af58a41ce1609455306f..03e810d202991bbf2add27707d244acf7e844d91 100644
--- a/src/scene_verifier/dryvr/core/guard.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/guard.py
@@ -7,7 +7,7 @@ import random
 import sympy
 from z3 import *
 
-from src.common.utils import handleReplace
+from dryvrpy.common.utils import handleReplace
 
 
 class Guard:
diff --git a/src/scene_verifier/dryvr/core/initialset.py b/dryvr_plus_plus/scene_verifier/dryvr/core/initialset.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/initialset.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/initialset.py
diff --git a/src/scene_verifier/dryvr/core/initialsetstack.py b/dryvr_plus_plus/scene_verifier/dryvr/core/initialsetstack.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/initialsetstack.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/initialsetstack.py
diff --git a/src/scene_verifier/dryvr/core/reachtube.py b/dryvr_plus_plus/scene_verifier/dryvr/core/reachtube.py
similarity index 100%
rename from src/scene_verifier/dryvr/core/reachtube.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/reachtube.py
diff --git a/src/scene_verifier/dryvr/core/reset.py b/dryvr_plus_plus/scene_verifier/dryvr/core/reset.py
similarity index 99%
rename from src/scene_verifier/dryvr/core/reset.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/reset.py
index 684b9c5e2b3af8de2ba8231d51e8d3dafdd32875..f6ed8f6b5b379ea2e5441b6989be18c4c9824854 100644
--- a/src/scene_verifier/dryvr/core/reset.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/reset.py
@@ -4,7 +4,7 @@ This file contains reset class for DryVR
 
 import sympy
 
-from src.common.utils import randomPoint
+from dryvrpy.common.utils import randomPoint
 
 
 class Reset:
diff --git a/src/scene_verifier/dryvr/core/uniformchecker.py b/dryvr_plus_plus/scene_verifier/dryvr/core/uniformchecker.py
similarity index 98%
rename from src/scene_verifier/dryvr/core/uniformchecker.py
rename to dryvr_plus_plus/scene_verifier/dryvr/core/uniformchecker.py
index 57641ad630bed35fed0199d015a90b7af6ba9210..f85fe792e1526d448e87fbcf79374debf3acfbf5 100644
--- a/src/scene_verifier/dryvr/core/uniformchecker.py
+++ b/dryvr_plus_plus/scene_verifier/dryvr/core/uniformchecker.py
@@ -4,8 +4,8 @@ This file contains uniform checker class for DryVR
 import sympy
 from z3 import *
 
-from src.common.constant import *
-from src.common.utils import handleReplace, neg
+from dryvrpy.common.constant import *
+from dryvrpy.common.utils import handleReplace, neg
 
 
 class UniformChecker:
diff --git a/src/scene_verifier/dryvr/discrepancy/Global_Disc.py b/dryvr_plus_plus/scene_verifier/dryvr/discrepancy/Global_Disc.py
similarity index 100%
rename from src/scene_verifier/dryvr/discrepancy/Global_Disc.py
rename to dryvr_plus_plus/scene_verifier/dryvr/discrepancy/Global_Disc.py
diff --git a/src/scene_verifier/dryvr/discrepancy/PW_Discrepancy.py b/dryvr_plus_plus/scene_verifier/dryvr/discrepancy/PW_Discrepancy.py
similarity index 100%
rename from src/scene_verifier/dryvr/discrepancy/PW_Discrepancy.py
rename to dryvr_plus_plus/scene_verifier/dryvr/discrepancy/PW_Discrepancy.py
diff --git a/src/scene_verifier/dryvr/discrepancy/__init__.py b/dryvr_plus_plus/scene_verifier/dryvr/discrepancy/__init__.py
similarity index 100%
rename from src/scene_verifier/dryvr/discrepancy/__init__.py
rename to dryvr_plus_plus/scene_verifier/dryvr/discrepancy/__init__.py
diff --git a/src/scene_verifier/map/__init__.py b/dryvr_plus_plus/scene_verifier/map/__init__.py
similarity index 100%
rename from src/scene_verifier/map/__init__.py
rename to dryvr_plus_plus/scene_verifier/map/__init__.py
diff --git a/src/scene_verifier/map/lane.py b/dryvr_plus_plus/scene_verifier/map/lane.py
similarity index 96%
rename from src/scene_verifier/map/lane.py
rename to dryvr_plus_plus/scene_verifier/map/lane.py
index cdc2551fa15ba974e820b6648d30adee4c6a4996..b482debdffdf838c3bb9bbc7781b8369a79f4883 100644
--- a/src/scene_verifier/map/lane.py
+++ b/dryvr_plus_plus/scene_verifier/map/lane.py
@@ -2,7 +2,7 @@ from typing import List
 
 import numpy as np
 
-from src.scene_verifier.map.lane_segment import AbstractLane
+from dryvrpy.scene_verifier.map.lane_segment import AbstractLane
 
 class Lane():
     COMPENSATE = 3
diff --git a/src/scene_verifier/map/lane_map.py b/dryvr_plus_plus/scene_verifier/map/lane_map.py
similarity index 96%
rename from src/scene_verifier/map/lane_map.py
rename to dryvr_plus_plus/scene_verifier/map/lane_map.py
index e63fe31b837370777a17670ecc489805bba5b69f..658c49dca39fcc252981ded28119636177a9a304 100644
--- a/src/scene_verifier/map/lane_map.py
+++ b/dryvr_plus_plus/scene_verifier/map/lane_map.py
@@ -4,8 +4,8 @@ from enum import Enum
 
 import numpy as np
 
-from src.scene_verifier.map.lane_segment import AbstractLane
-from src.scene_verifier.map.lane import Lane
+from dryvrpy.scene_verifier.map.lane_segment import AbstractLane
+from dryvrpy.scene_verifier.map.lane import Lane
 
 class LaneMap:
     def __init__(self, lane_seg_list:List[Lane] = []):
diff --git a/src/scene_verifier/map/lane_segment.py b/dryvr_plus_plus/scene_verifier/map/lane_segment.py
similarity index 98%
rename from src/scene_verifier/map/lane_segment.py
rename to dryvr_plus_plus/scene_verifier/map/lane_segment.py
index 3b841ae8950f2a96e7c93fafe3ed89e062e7b9b4..0c20dc9a06703c6e509e61f6200e4d86580cc7bd 100644
--- a/src/scene_verifier/map/lane_segment.py
+++ b/dryvr_plus_plus/scene_verifier/map/lane_segment.py
@@ -3,7 +3,7 @@ import numpy as np
 from abc import ABCMeta, abstractmethod
 from typing import Tuple, List, Optional, Union
 
-from src.scene_verifier.utils.utils import wrap_to_pi, Vector, get_class_path, class_from_path,to_serializable
+from dryvrpy.scene_verifier.utils.utils import wrap_to_pi, Vector, get_class_path, class_from_path,to_serializable
 
 class LineType:
 
diff --git a/src/scene_verifier/scenario/__init__.py b/dryvr_plus_plus/scene_verifier/scenario/__init__.py
similarity index 100%
rename from src/scene_verifier/scenario/__init__.py
rename to dryvr_plus_plus/scene_verifier/scenario/__init__.py
diff --git a/src/scene_verifier/scenario/scenario.py b/dryvr_plus_plus/scene_verifier/scenario/scenario.py
similarity index 96%
rename from src/scene_verifier/scenario/scenario.py
rename to dryvr_plus_plus/scene_verifier/scenario/scenario.py
index 49453404022848b67f9e66466dfa1a7a7ca44262..095542954e1d34f742ef13aeeca0b72a063cff94 100644
--- a/src/scene_verifier/scenario/scenario.py
+++ b/dryvr_plus_plus/scene_verifier/scenario/scenario.py
@@ -5,14 +5,14 @@ import warnings
 
 import numpy as np
 
-from src.scene_verifier.agents.base_agent import BaseAgent
-from src.scene_verifier.automaton.guard import GuardExpressionAst
-from src.scene_verifier.automaton.reset import ResetExpression
-from src.scene_verifier.code_parser.pythonparser import Guard, Reset
-from src.scene_verifier.analysis.simulator import Simulator
-from src.scene_verifier.analysis.verifier import Verifier
-from src.scene_verifier.map.lane_map import LaneMap
-from src.scene_verifier.utils.utils import *
+from dryvrpy.scene_verifier.agents.base_agent import BaseAgent
+from dryvrpy.scene_verifier.automaton.guard import GuardExpressionAst
+from dryvrpy.scene_verifier.automaton.reset import ResetExpression
+from dryvrpy.scene_verifier.code_parser.pythonparser import Guard, Reset
+from dryvrpy.scene_verifier.analysis.simulator import Simulator
+from dryvrpy.scene_verifier.analysis.verifier import Verifier
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.utils.utils import *
 
 class Scenario:
     def __init__(self):
diff --git a/src/scene_verifier/utils/__init__.py b/dryvr_plus_plus/scene_verifier/utils/__init__.py
similarity index 100%
rename from src/scene_verifier/utils/__init__.py
rename to dryvr_plus_plus/scene_verifier/utils/__init__.py
diff --git a/src/scene_verifier/utils/utils.py b/dryvr_plus_plus/scene_verifier/utils/utils.py
similarity index 100%
rename from src/scene_verifier/utils/utils.py
rename to dryvr_plus_plus/scene_verifier/utils/utils.py
diff --git a/example_controller1.py b/example_controller1.py
index 5a870473b884ae50897f8fc7d4ea6fb409cd9216..d2064d0f6c28381e57b20b1be53851249ab7e9a6 100644
--- a/example_controller1.py
+++ b/example_controller1.py
@@ -1,6 +1,6 @@
 from enum import Enum, auto
 import copy
-from src.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
 
 class LaneObjectMode(Enum):
     Vehicle = auto()
diff --git a/example_controller2.py b/example_controller2.py
index 0c09ce25e113c103a47c1e5c865f3e0d46e45cd6..4738b10146d7871759774acfbe073e6f3674f468 100644
--- a/example_controller2.py
+++ b/example_controller2.py
@@ -1,6 +1,6 @@
 from enum import Enum, auto
 import copy
-from src.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
 
 class VehicleMode(Enum):
     Normal = auto()
diff --git a/example_controller3.py b/example_controller3.py
index 504995e3601fa244237c2c91e5edfe4e6d8f3716..d162f143f8a0e165114a93f596591ebd3e7e3401 100644
--- a/example_controller3.py
+++ b/example_controller3.py
@@ -1,6 +1,6 @@
 from enum import Enum, auto
 import copy
-from src.scene_verifier.map.lane_map import LaneMap
+from dryvrpy.scene_verifier.map.lane_map import LaneMap
 
 class VehicleMode(Enum):
     Normal = auto()
diff --git a/example_two_car_sign_lane_switch.py b/example_two_car_sign_lane_switch.py
index a18b874cabc712e20fff2ca469222db551845dd8..cc895f1df86463130117ad9c9b9a68a28d30f3d4 100644
--- a/example_two_car_sign_lane_switch.py
+++ b/example_two_car_sign_lane_switch.py
@@ -68,12 +68,12 @@ def controller(ego: State, other: State, sign: State, lane_map):
     return output
 
 
-from src.example.example_agent.car_agent import CarAgent
-from src.example.example_agent.sign_agent import SignAgent
-from src.scene_verifier.scenario.scenario import Scenario
-from src.example.example_map.simple_map2 import SimpleMap3
-from src.plotter.plotter2D import plot_reachtube_tree, plot_simulation_tree
-from src.example.example_sensor.fake_sensor import FakeSensor2
+from dryvrpy.example.example_agent.car_agent import CarAgent
+from dryvrpy.example.example_agent.sign_agent import SignAgent
+from dryvrpy.scene_verifier.scenario.scenario import Scenario
+from dryvrpy.example.example_map.simple_map2 import SimpleMap3
+from dryvrpy.plotter.plotter2D import plot_reachtube_tree, plot_simulation_tree
+from dryvrpy.example.example_sensor.fake_sensor import FakeSensor2
 
 import matplotlib.pyplot as plt
 
@@ -92,7 +92,7 @@ if __name__ == "__main__":
     scenario.set_init(
         [
             [[10, 0, 0, 0.5],[10, 0, 0, 0.5]], 
-            [[0, -0.2, 0, 1.0],[0.2, -0.2, 0, 1.0]],
+            [[0, -0.2, 0, 1.0],[0.2, 0.2, 0, 1.0]],
             [[20, 0, 0, 0],[20, 0, 0, 0]],
         ],
         [
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..25e99f51d402f9a5352c5203612e0aba391f0a52
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+from setuptools import setup
+
+setup(
+    name='dryvr_plus_plus',
+    version='0.1',
+    description='DryVR++',
+    author='MaybeShewill-CV',
+    maintainer='Chiao Hsieh',
+    maintainer_email='chsieh16@illinois.edu',
+    license='Apache-2.0',
+    packages=["dryvr_plus_plus"],
+    python_requires='>=3.6',
+    install_requires=[
+        "numpy~=1.22.1",
+        "scipy~=1.8.0",
+        "matplotlib~=3.4.2",
+        "polytope~=0.2.3",
+        "pyvista~=0.32.1",
+        "networkx~=2.2",
+        "sympy~=1.6.2",
+        "six~=1.14.0",
+        "astunparse~=1.6.3",
+        "treelib~=1.6.1",
+        "z3-solver~=4.8.17.0",
+        "igraph~=0.9.10",
+    ],
+    classifiers=[
+        'Development Status :: 2 - Pre-Alpha',
+        'Intended Audience :: Science/Research',
+        'Topic :: Scientific/Engineering',
+        'License :: OSI Approved :: Apache License 2.0',
+        'Programming Language :: Python :: 3.8',
+    ]
+)
\ No newline at end of file
diff --git a/tests/testdpp.py b/tests/testdpp.py
index e544e0493de355594d711f3a3ebf1410f6fb11b9..c425ca1dc20d6a2a9c33a085f0cc7f79bc7aa0b5 100644
--- a/tests/testdpp.py
+++ b/tests/testdpp.py
@@ -47,10 +47,10 @@ def controller(ego:State):
 
     return output_vehicle_mode, output_lane_mode
 
-from src.example.example_agent.car_agent import CarAgent
-from src.scene_verifier.scenario.scenario import Scenario
-from src.example.example_map.simple_map import SimpleMap2
-from src.example.example_sensor.fake_sensor import FakeSensor1
+from dryvrpy.example.example_agent.car_agent import CarAgent
+from dryvrpy.scene_verifier.scenario.scenario import Scenario
+from dryvrpy.example.example_map.simple_map import SimpleMap2
+from dryvrpy.example.example_sensor.fake_sensor import FakeSensor1
 import matplotlib.pyplot as plt
 import numpy as np