diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
index f9f2f17..3258456 100644
--- a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
@@ -28,15 +28,22 @@
    private final UUID sessionKey;
    private final OteServiceProperties props;
    private final IHostTestEnvironment hostTestEnvironment;
+   private final boolean isUnauthorizedUser;
 
-   public ConnectionEvent(IHostTestEnvironment hostTestEnvironment, IServiceConnector connector, ITestEnvironment environment, UUID sessionKey) {
-      if (connector == null) {
-         throw new NullPointerException("connector cannot be null");
+   public ConnectionEvent(IHostTestEnvironment hostTestEnvironment, IServiceConnector connector, ITestEnvironment environment, 
+         UUID sessionKey, boolean isUnauthorizedUser) {
+      
+      if (!isUnauthorizedUser) {
+         if (connector == null) {
+            throw new NullPointerException("connector cannot be null");
+         }
       }
+      
       this.environment = environment;
       this.connector = connector;
       this.sessionKey = sessionKey;
       this.hostTestEnvironment = hostTestEnvironment;
+      this.isUnauthorizedUser = isUnauthorizedUser;
       props = new OteServiceProperties(connector);
    }
 
@@ -75,4 +82,8 @@
       return hostTestEnvironment;
    }
 
+   public boolean isUnauthorizedUser() {
+      return isUnauthorizedUser;
+   }
+
 }
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
index c850a25..1196269 100644
--- a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
@@ -56,7 +56,7 @@
    }
 
    @Override
-   public String getAddress() throws RemoteException {
+   public String getAddress() {
       return address.getHostAddress();
    }
 
@@ -101,7 +101,7 @@
    }
 
    @Override
-   public void initiateInformationalPrompt(String message) throws RemoteException {
+   public void initiateInformationalPrompt(String message) {
       assert sessionDelegate != null : "delegate is null";
       try {
          sessionDelegate.handleInformationPrompt(message);
@@ -162,12 +162,12 @@
     * closes this session
     */
    void close() {
-
+      // INTENTIONALLY EMPTY BLOCK
    }
 
    TestHostConnection connect(IServiceConnector connector, IHostTestEnvironment testHost, TestEnvironmentConfig config) throws Exception {
       // intentionally package-private
-      if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+       if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
          try {
             IRemoteUserSession exportedSession = (IRemoteUserSession) connector.export(this);
             UUID id = UUID.randomUUID();
@@ -175,10 +175,12 @@
             ConnectionRequestResult result = testHost.requestEnvironment(exportedSession, id, config);
             if (result != null && result.getStatus().getStatus()) {
                connector.setConnected(true);
-               return new TestHostConnection(connector, testHost, result.getEnvironment(), result.getSessionKey());
+               return new TestHostConnection(connector, testHost, result.getEnvironment(), result.getSessionKey(), false);
+            } else if (result != null && result.getStatus().isUnauthorizedUser()) {
+               return new TestHostConnection(null, testHost, null, null, true);
             } else {
                OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, "Error Connecting to the OTE Test Server.",
-                  new Exception(result.getStatus().getMessage()));
+                     new Exception(result.getStatus().getMessage()));
             }
             return null;
          } finally {
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
index 176d3d3..24db862 100644
--- a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
@@ -89,7 +89,7 @@
 	}
 
 	@Override
-	public  ConnectionEvent connect(IHostTestEnvironment testHost, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws IllegalArgumentException, TestSessionException {
+	public  ConnectionEvent connect(IHostTestEnvironment testHost, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws IllegalArgumentException {
 		checkState();
 		final IServiceConnector connector;
 		final ClientSession localSession;
@@ -113,14 +113,20 @@
 			if(configurer.configure(testHost, new SubProgressMonitor(monitor, 95)) && !monitor.isCanceled()){
 			   testConnection = localSession.connect(connector, testHost, config);
 			   if (testConnection != null) {
-			      // success
-			      ConnectionEvent event = new ConnectionEvent(testHost, connector, testConnection.getConnectEnvironment(), testConnection.getSessionKey());
-			      listenerNotifier.notifyPostConnection(event);
-			      return event;
+			      if (testConnection.isUnauthorizedUser()) {
+			         ConnectionEvent event = new ConnectionEvent(null, null, null, null, true);
+			         testConnection = null; //Not really connected after this.
+                  return event;
+			      } else {
+			         // success
+			         ConnectionEvent event = new ConnectionEvent(testHost, connector, testConnection.getConnectEnvironment(), testConnection.getSessionKey(), false);
+			         listenerNotifier.notifyPostConnection(event);
+			         return event;
+			      }
 			   }
 			}
 		} catch (Exception e) {
-			Activator.log(Level.SEVERE, "failed to establish connection", e);
+		   Activator.log(Level.SEVERE, "failed to establish connection", e);
 			testConnection = null;
 		}
 		return null;
@@ -165,7 +171,7 @@
 			} else {
 				ConnectionEvent event =
 						new ConnectionEvent(this.getConnectedHost(), testConnection.getConnectedTestHost(), envirnonment,
-								testConnection.getSessionKey());
+								testConnection.getSessionKey(), false);
 				listenerNotifier.notifyDisconnect(event);
 				try {
 					session.disconnect(testConnection);
@@ -215,7 +221,7 @@
 					if (testConnection  != null) {
 						event = new ConnectionEvent(this.getConnectedHost(),
 								testConnection.getServiceConnector(), testConnection.getConnectEnvironment(),
-								testConnection.getSessionKey());
+								testConnection.getSessionKey(), false);
 					} else {
 						event = null;
 					}
@@ -347,6 +353,7 @@
 
 	@Override
 	public void onConnectionServiceStopped() {
+	   // INTENTIONALLY EMPTY BLOCK
 	}
 
 	@Override
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
index 6680b6b..d1ba198 100644
--- a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
@@ -30,18 +30,24 @@
    private final UUID sessionKey;
    private final IHostTestEnvironment host;
    private String serverId;
+   private final boolean isUnauthorizedUser;
 
-   TestHostConnection(IServiceConnector connector, IHostTestEnvironment host, ITestEnvironment connectEnvironment, UUID uuid) {
+   TestHostConnection(IServiceConnector connector, IHostTestEnvironment host, ITestEnvironment connectEnvironment, 
+         UUID uuid, boolean isUnauthorizedUser) {
       // intentionally package-private
-      if (connector == null) {
-         throw new NullPointerException("service connector cannot be null");
+
+      if (!isUnauthorizedUser) {
+         if (connector == null) {
+            throw new NullPointerException("service connector cannot be null");
+         }
+         if (connectEnvironment == null) {
+            throw new NullPointerException("test environment cannot be null");
+         }
+         if (uuid == null) {
+            throw new NullPointerException("session key cannot be null");
+         }
       }
-      if (connectEnvironment == null) {
-         throw new NullPointerException("test environment cannot be null");
-      }
-      if (uuid == null) {
-         throw new NullPointerException("session key cannot be null");
-      }
+      
       this.serviceConnector = connector;
       this.host = host;
       this.connectEnvironment = connectEnvironment;
@@ -51,6 +57,7 @@
       } catch (RemoteException e) {
     	  this.serverId = "";
       }
+      this.isUnauthorizedUser = isUnauthorizedUser;
    }
 
    /**
@@ -90,4 +97,8 @@
 
       host.disconnect(sessionKey);
    }
+
+   public boolean isUnauthorizedUser() {
+      return isUnauthorizedUser;
+   }
 }
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
index 164db85..53188f4 100644
--- a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
@@ -20,11 +20,13 @@
    private static final long serialVersionUID = -7774073812320127561L;
 
    private final boolean status;
+   private final boolean unauthorizedUser;
    private final String message;
 
-   public ReturnStatus(String message, boolean status) {
+   public ReturnStatus(String message, boolean status, boolean unauthorizedUser) {
       this.status = status;
       this.message = message;
+      this.unauthorizedUser = unauthorizedUser;
    }
 
    public boolean getStatus() {
@@ -34,4 +36,8 @@
    public String getMessage() {
       return message;
    }
+   
+   public boolean isUnauthorizedUser() {
+      return unauthorizedUser;
+   }
 }
diff --git a/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
index 45c2cfd..5f76501 100644
--- a/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
+++ b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
@@ -2,6 +2,7 @@
 
 public enum OtePropertiesCore implements OteProperties {
 
+   authorizedUser("ote.authorized.user"),
    batchFolderDays("ote.batchfolder.days"),
    brokerUriPort("ote.server.broker.uri.port"),
    endpointPort("ote.endpoint.port"),
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
index 1a797f7..7e34c3b 100644
--- a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
@@ -45,7 +45,14 @@
             if (outfileLocation == null) {
                outfileLocation = OtePropertiesCore.javaIoTmpdir.getValue();
             }
-            String title = OtePropertiesCore.serverTitle.getValue();
+            
+            String title;
+            if (OtePropertiesCore.authorizedUser.getValue() != null) {
+               title = OtePropertiesCore.serverTitle.getValue() + "[AUTHORIZED USER:" + OtePropertiesCore.authorizedUser.getValue() + "]";
+            } else {
+               title = OtePropertiesCore.serverTitle.getValue();
+            }
+            
             String name = OtePropertiesCore.userName.getValue();
             String keepEnvAliveWithNoUsersStr = OtePropertiesCore.serverKeepalive.getValue();
             boolean keepEnvAliveWithNoUsers = true;
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
index a5c3ce3..2c10365 100644
--- a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
@@ -77,7 +77,7 @@
       enhancedProperties.setProperty(HostServerProperties.owner.name(), OtePropertiesCore.userName.getValue());
       enhancedProperties.setProperty(HostServerProperties.id.name(), serviceID.toString());
       enhancedProperties.setProperty(HostServerProperties.isSim.name(), Boolean.toString(environmentCreation.isSimulated()));
-//      enhancedProperties.setProperty(HostServerProperties.activeMq.name(), environmentCreation.getBroker().getUri().toString());
+      //      enhancedProperties.setProperty(HostServerProperties.activeMq.name(), environmentCreation.getBroker().getUri().toString());
       try {
          String format = String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort());
          if(OtePropertiesCore.httpPort.getValue() == null){
@@ -115,7 +115,7 @@
 //   }
 
    @Override
-   public EnhancedProperties getProperties() throws RemoteException {
+   public EnhancedProperties getProperties() {
       return enhancedProperties;
    }
 
@@ -123,14 +123,20 @@
    public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID sessionId, TestEnvironmentConfig config) throws RemoteException {
       try {
          OseeLog.log(OteService.class, Level.INFO,
-            "received request for test environment from user " + session.getUser().getName());
-         if (!isEnvironmentAvailable()) {
-            createEnvironment();
+               "received request for test environment from user " + session.getUser().getName());
+
+         if (isAuthorizedUser(session)) {
+            if (!isEnvironmentAvailable()) {
+               createEnvironment();
+            }
+            
+            oteSessions.add(sessionId, session);
+            updateDynamicInfo();
+            return new ConnectionRequestResult(remoteEnvironment, sessionId, new ReturnStatus("Success", true, false));
+         } 
+         else {
+            return new ConnectionRequestResult(null, null, new ReturnStatus("Failure", false, true));
          }
-         
-         oteSessions.add(sessionId, session);
-         updateDynamicInfo();
-         return new ConnectionRequestResult(remoteEnvironment, sessionId, new ReturnStatus("Success", true));
       } catch (Throwable ex) {
          OseeLog.log(OteService.class, Level.SEVERE,
             "Exception while requesting environment for user " + session.getUser().getName(), ex);
@@ -138,6 +144,21 @@
       }
    }
 
+   private boolean isAuthorizedUser(IRemoteUserSession session) throws RemoteException {
+
+      if (OtePropertiesCore.authorizedUser.getValue() == null) {
+         return true;
+      } else {
+         String [] authorizedUsers = OtePropertiesCore.authorizedUser.getValue().split(",");
+         for (int i = 0; i < authorizedUsers.length; i++) {
+            if (authorizedUsers[i].equals(session.getUser().getName())) {
+               return true;
+            }
+         }
+         return false;
+      }
+   }
+
    private void createEnvironment() throws Throwable {
       currentEnvironment = environmentCreation.createEnvironment();
       remoteEnvironment = environmentCreation.createRemoteTestEnvironment(currentEnvironment);
@@ -148,7 +169,7 @@
       return remoteEnvironment != null;
    }
 
-   public void updateDynamicInfo() throws RemoteException {
+   public void updateDynamicInfo() {
       Collection<OSEEPerson1_4> userList = new LinkedList<>();
       StringBuilder sb = new StringBuilder();
       if (isEnvironmentAvailable()) {
@@ -176,11 +197,11 @@
 //      }
    }
 
-   public ServiceID getServiceID() throws RemoteException {
+   public ServiceID getServiceID() {
       return serviceID;
    }
 
-   public void kill() throws RemoteException {
+   public void kill() {
       if(currentEnvironment != null){
          currentEnvironment.shutdown();
       }
@@ -191,7 +212,7 @@
 //   }
 
    @Override
-   public void disconnect(UUID sessionId) throws RemoteException {
+   public void disconnect(UUID sessionId) {
       if (currentEnvironment != null) {
          oteSessions.remove(sessionId);
          updateDynamicInfo();
@@ -199,7 +220,7 @@
    }
 
    @Override
-   public String getHttpURL() throws RemoteException {
+   public String getHttpURL() {
       return (String)enhancedProperties.getProperty("appServerURI");
    }
    
