diff --git a/src/box/replica.cc b/src/box/replica.cc
index 112bc0f2b9cb8b74aa271d70916b2062e6828e98..cc87fd456c0c7d22cc43dbab68409d1efd8fdbb2 100644
--- a/src/box/replica.cc
+++ b/src/box/replica.cc
@@ -165,6 +165,12 @@ replica_bootstrap(struct recovery_state *r)
 	/* master socket closed by guard */
 }
 
+static void
+remote_set_status(struct remote *remote, const char *status)
+{
+	title("replica", "%s/%s", port_uri_to_string(&remote->uri), status);
+}
+
 static void
 pull_from_remote(va_list ap)
 {
@@ -183,8 +189,7 @@ pull_from_remote(va_list ap)
 			struct iproto_header row;
 			fiber_setcancellable(true);
 			if (! evio_is_active(&coio)) {
-				title("replica", "%s/%s", r->remote.source,
-				      "connecting");
+				remote_set_status(&r->remote, "connecting");
 				if (iobuf == NULL)
 					iobuf = iobuf_new(fiber_name(fiber()));
 				err = "can't connect to master";
@@ -195,8 +200,7 @@ pull_from_remote(va_list ap)
 					&r->server_uuid, &r->vclock);
 				remote_write_row(&coio, &row);
 				warning_said = false;
-				title("replica", "%s/%s", r->remote.source,
-				      "connected");
+				remote_set_status(&r->remote, "connected");
 			}
 			err = "can't read row";
 			remote_read_row(&coio, iobuf, &row);
@@ -214,12 +218,12 @@ pull_from_remote(va_list ap)
 			iobuf_reset(iobuf);
 			fiber_gc();
 		} catch (FiberCancelException *e) {
-			title("replica", "%s/%s", r->remote.source, "failed");
+			remote_set_status(&r->remote, "failed");
 			iobuf_delete(iobuf);
 			evio_close(loop, &coio);
 			throw;
 		} catch (Exception *e) {
-			title("replica", "%s/%s", r->remote.source, "failed");
+			remote_set_status(&r->remote, "failed");
 			e->log();
 			if (! warning_said) {
 				if (err != NULL)
@@ -257,8 +261,9 @@ recovery_follow_remote(struct recovery_state *r)
 	assert(r->remote.reader == NULL);
 	assert(recovery_has_remote(r));
 
-	say_crit("starting replication from %s", r->remote.source);
-	snprintf(name, sizeof(name), "replica/%s", r->remote.source);
+	const char *uri = port_uri_to_string(&r->remote.uri);
+	say_crit("starting replication from %s", uri);
+	snprintf(name, sizeof(name), "replica/%s", uri);
 
 	try {
 		f = fiber_new(name, pull_from_remote);
diff --git a/src/port_uri.cc b/src/port_uri.cc
index 0a41b2864a3ea20e9490b9d6bd388ad0ad215b11..5f1e0efb0213ecde8b2c2a984a58ffc21441106b 100644
--- a/src/port_uri.cc
+++ b/src/port_uri.cc
@@ -63,12 +63,23 @@ port_uri_to_string(const struct port_uri * uri)
 			    shost, sizeof(shost),
 			    sservice, sizeof(sservice),
 			    NI_NUMERICHOST|NI_NUMERICSERV);
-		if (uri->addr.sa_family == AF_INET)
-			snprintf(str, sizeof(str), "%s://%s:%s",
-				 uri->schema, shost, sservice);
-		else
-			snprintf(str, sizeof(str), "%s://[%s]:%s",
-				 uri->schema, shost, sservice);
+		if (uri->addr.sa_family == AF_INET) {
+			if (strncmp(uri->schema, "tcp", 3) == 0) {
+				snprintf(str, sizeof(str), "%s:%s",
+					 shost, sservice);
+			} else {
+				snprintf(str, sizeof(str), "%s://%s:%s",
+					 uri->schema, shost, sservice);
+			}
+		} else {
+			if (strncmp(uri->schema, "tcp", 3) == 0) {
+				snprintf(str, sizeof(str), "%s:%s",
+					 shost, sservice);
+			} else {
+				snprintf(str, sizeof(str), "%s://[%s]:%s",
+					 uri->schema, shost, sservice);
+			}
+		}
                 break;
 	}
 	case AF_UNIX:
@@ -113,7 +124,7 @@ port_uri_parse(struct port_uri *uri, const char *p)
 	unsigned port = 0;
 
 	
-#line 117 "src/port_uri.cc"
+#line 128 "src/port_uri.cc"
 static const int port_uri_start = 1;
 static const int port_uri_first_final = 74;
 static const int port_uri_error = 0;
@@ -121,12 +132,12 @@ static const int port_uri_error = 0;
 static const int port_uri_en_main = 1;
 
 
-#line 125 "src/port_uri.cc"
+#line 136 "src/port_uri.cc"
 	{
 	cs = port_uri_start;
 	}
 
-#line 130 "src/port_uri.cc"
+#line 141 "src/port_uri.cc"
 	{
 	if ( p == pe )
 		goto _test_eof;
@@ -151,40 +162,46 @@ case 1:
 		goto tr5;
 	goto tr0;
 tr0:
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+	goto st74;
+tr82:
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st74;
 st74:
 	if ( ++p == pe )
 		goto _test_eof74;
 case 74:
-#line 162 "src/port_uri.cc"
+#line 179 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	goto st74;
-tr91:
-#line 147 "src/port_uri.rl"
+tr94:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st2;
-tr141:
-#line 134 "src/port_uri.rl"
+tr144:
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st2;
-tr154:
-#line 143 "src/port_uri.rl"
+tr157:
+#line 154 "src/port_uri.rl"
 	{ ip6.end   = p - 1; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st2;
 st2:
 	if ( ++p == pe )
 		goto _test_eof2;
 case 2:
-#line 188 "src/port_uri.cc"
+#line 205 "src/port_uri.cc"
 	if ( (*p) < 65 ) {
 		if ( 49 <= (*p) && (*p) <= 57 )
 			goto tr8;
@@ -198,34 +215,34 @@ case 2:
 cs = 0;
 	goto _out;
 tr8:
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st75;
-tr92:
-#line 151 "src/port_uri.rl"
+tr95:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st75;
 st75:
 	if ( ++p == pe )
 		goto _test_eof75;
 case 75:
-#line 217 "src/port_uri.cc"
+#line 234 "src/port_uri.cc"
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr92;
+		goto tr95;
 	goto st0;
 tr9:
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st76;
 st76:
 	if ( ++p == pe )
 		goto _test_eof76;
 case 76:
-#line 229 "src/port_uri.cc"
+#line 246 "src/port_uri.cc"
 	if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st77;
@@ -378,18 +395,18 @@ case 90:
 case 91:
 	goto st0;
 tr1:
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 165 "src/port_uri.rl"
+#line 176 "src/port_uri.rl"
 	{ path.start = p; }
 	goto st92;
 st92:
 	if ( ++p == pe )
 		goto _test_eof92;
 case 92:
-#line 391 "src/port_uri.cc"
+#line 408 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr109;
+		case 58: goto tr112;
 		case 63: goto st95;
 	}
 	goto st93;
@@ -398,62 +415,62 @@ case 92:
 		goto _test_eof93;
 case 93:
 	switch( (*p) ) {
-		case 58: goto tr109;
+		case 58: goto tr112;
 		case 63: goto st95;
 	}
 	goto st93;
-tr109:
-#line 147 "src/port_uri.rl"
+tr112:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st94;
 st94:
 	if ( ++p == pe )
 		goto _test_eof94;
 case 94:
-#line 414 "src/port_uri.cc"
+#line 431 "src/port_uri.cc"
 	if ( (*p) < 65 ) {
 		if ( 49 <= (*p) && (*p) <= 57 )
-			goto tr111;
+			goto tr114;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr112;
+			goto tr115;
 	} else
-		goto tr112;
+		goto tr115;
 	goto st95;
 st95:
 	if ( ++p == pe )
 		goto _test_eof95;
 case 95:
 	goto st95;
-tr111:
-#line 155 "src/port_uri.rl"
+tr114:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st96;
-tr113:
-#line 151 "src/port_uri.rl"
+tr116:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st96;
 st96:
 	if ( ++p == pe )
 		goto _test_eof96;
 case 96:
-#line 445 "src/port_uri.cc"
+#line 462 "src/port_uri.cc"
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr113;
+		goto tr116;
 	goto st95;
-tr112:
-#line 155 "src/port_uri.rl"
+tr115:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st97;
 st97:
 	if ( ++p == pe )
 		goto _test_eof97;
 case 97:
-#line 457 "src/port_uri.cc"
+#line 474 "src/port_uri.cc"
 	if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st98;
@@ -606,21 +623,31 @@ case 111:
 case 112:
 	goto st95;
 tr2:
-#line 125 "src/port_uri.rl"
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
+#line 144 "src/port_uri.rl"
+	{ ip4.start = p; }
+	goto st113;
+tr83:
 #line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 136 "src/port_uri.rl"
+	{ login.start  = p; }
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st113;
 st113:
 	if ( ++p == pe )
 		goto _test_eof113;
 case 113:
-#line 621 "src/port_uri.cc"
+#line 648 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -637,7 +664,7 @@ case 113:
 		goto _test_eof114;
 case 114:
 	switch( (*p) ) {
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -649,7 +676,7 @@ case 114:
 case 115:
 	switch( (*p) ) {
 		case 46: goto st116;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -660,7 +687,7 @@ case 115:
 		goto _test_eof116;
 case 116:
 	switch( (*p) ) {
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -672,7 +699,7 @@ case 116:
 case 117:
 	switch( (*p) ) {
 		case 46: goto st118;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -683,7 +710,7 @@ case 117:
 		goto _test_eof118;
 case 118:
 	switch( (*p) ) {
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -694,7 +721,7 @@ case 118:
 		goto _test_eof119;
 case 119:
 	switch( (*p) ) {
-		case 58: goto tr141;
+		case 58: goto tr144;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -705,7 +732,7 @@ case 119:
 		goto _test_eof120;
 case 120:
 	switch( (*p) ) {
-		case 58: goto tr141;
+		case 58: goto tr144;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -716,7 +743,7 @@ case 120:
 		goto _test_eof121;
 case 121:
 	switch( (*p) ) {
-		case 58: goto tr141;
+		case 58: goto tr144;
 		case 63: goto st0;
 	}
 	goto st74;
@@ -726,7 +753,7 @@ case 121:
 case 122:
 	switch( (*p) ) {
 		case 46: goto st118;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -738,7 +765,7 @@ case 122:
 case 123:
 	switch( (*p) ) {
 		case 46: goto st118;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	goto st74;
@@ -748,7 +775,7 @@ case 123:
 case 124:
 	switch( (*p) ) {
 		case 46: goto st116;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -760,7 +787,7 @@ case 124:
 case 125:
 	switch( (*p) ) {
 		case 46: goto st116;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	goto st74;
@@ -770,7 +797,7 @@ case 125:
 case 126:
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -788,7 +815,7 @@ case 126:
 case 127:
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -800,19 +827,21 @@ case 127:
 	} else
 		goto st128;
 	goto st74;
-tr82:
-#line 125 "src/port_uri.rl"
+tr84:
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st128;
 st128:
 	if ( ++p == pe )
 		goto _test_eof128;
 case 128:
-#line 814 "src/port_uri.cc"
+#line 843 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -824,17 +853,17 @@ case 128:
 	} else
 		goto st128;
 	goto st74;
-tr131:
-#line 126 "src/port_uri.rl"
+tr134:
+#line 137 "src/port_uri.rl"
 	{ login.end    = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st3;
 st3:
 	if ( ++p == pe )
 		goto _test_eof3;
 case 3:
-#line 838 "src/port_uri.cc"
+#line 867 "src/port_uri.cc"
 	if ( (*p) == 48 )
 		goto tr10;
 	if ( (*p) < 65 ) {
@@ -847,14 +876,14 @@ case 3:
 		goto tr12;
 	goto st0;
 tr10:
-#line 129 "src/port_uri.rl"
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
 	goto st4;
 st4:
 	if ( ++p == pe )
 		goto _test_eof4;
 case 4:
-#line 858 "src/port_uri.cc"
+#line 887 "src/port_uri.cc"
 	if ( (*p) == 64 )
 		goto tr14;
 	if ( (*p) < 65 ) {
@@ -867,14 +896,14 @@ case 4:
 		goto st4;
 	goto st0;
 tr14:
-#line 130 "src/port_uri.rl"
+#line 141 "src/port_uri.rl"
 	{ password.end   = p; }
 	goto st5;
 st5:
 	if ( ++p == pe )
 		goto _test_eof5;
 case 5:
-#line 878 "src/port_uri.cc"
+#line 907 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st0;
 		case 63: goto st0;
@@ -884,19 +913,19 @@ case 5:
 		goto tr15;
 	goto tr0;
 tr15:
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 133 "src/port_uri.rl"
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st129;
 st129:
 	if ( ++p == pe )
 		goto _test_eof129;
 case 129:
-#line 897 "src/port_uri.cc"
+#line 926 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -908,7 +937,7 @@ case 129:
 case 130:
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -920,23 +949,31 @@ case 130:
 case 131:
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr91;
+		case 58: goto tr94;
 		case 63: goto st0;
 	}
 	goto st74;
 tr6:
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 142 "src/port_uri.rl"
+#line 153 "src/port_uri.rl"
+	{ ip6.start = p + 1; }
+	goto st132;
+tr85:
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+#line 153 "src/port_uri.rl"
 	{ ip6.start = p + 1; }
 	goto st132;
 st132:
 	if ( ++p == pe )
 		goto _test_eof132;
 case 132:
-#line 938 "src/port_uri.cc"
+#line 975 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr149;
+		case 58: goto tr152;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -953,7 +990,7 @@ case 132:
 		goto _test_eof133;
 case 133:
 	switch( (*p) ) {
-		case 58: goto tr151;
+		case 58: goto tr154;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -970,7 +1007,7 @@ case 133:
 		goto _test_eof134;
 case 134:
 	switch( (*p) ) {
-		case 58: goto tr151;
+		case 58: goto tr154;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -987,7 +1024,7 @@ case 134:
 		goto _test_eof135;
 case 135:
 	switch( (*p) ) {
-		case 58: goto tr151;
+		case 58: goto tr154;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -1004,19 +1041,19 @@ case 135:
 		goto _test_eof136;
 case 136:
 	switch( (*p) ) {
-		case 58: goto tr151;
+		case 58: goto tr154;
 		case 63: goto st0;
 	}
 	goto st74;
-tr151:
-#line 147 "src/port_uri.rl"
+tr154:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st6;
 st6:
 	if ( ++p == pe )
 		goto _test_eof6;
 case 6:
-#line 1020 "src/port_uri.cc"
+#line 1057 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 48: goto st7;
 		case 58: goto st11;
@@ -1631,103 +1668,103 @@ case 45:
 		goto _test_eof137;
 case 137:
 	if ( (*p) == 58 )
-		goto tr154;
+		goto tr157;
 	goto st0;
 tr17:
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st138;
 st138:
 	if ( ++p == pe )
 		goto _test_eof138;
 case 138:
-#line 1649 "src/port_uri.cc"
+#line 1686 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st11;
 		case 93: goto st137;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr155;
+			goto tr158;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st8;
 	} else
 		goto st8;
 	goto st0;
-tr155:
-#line 151 "src/port_uri.rl"
+tr158:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st139;
 st139:
 	if ( ++p == pe )
 		goto _test_eof139;
 case 139:
-#line 1671 "src/port_uri.cc"
+#line 1708 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st11;
 		case 93: goto st137;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr156;
+			goto tr159;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st9;
 	} else
 		goto st9;
 	goto st0;
-tr156:
-#line 151 "src/port_uri.rl"
+tr159:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st140;
 st140:
 	if ( ++p == pe )
 		goto _test_eof140;
 case 140:
-#line 1693 "src/port_uri.cc"
+#line 1730 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st11;
 		case 93: goto st137;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr157;
+			goto tr160;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st10;
 	} else
 		goto st10;
 	goto st0;
-tr157:
-#line 151 "src/port_uri.rl"
+tr160:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st141;
 st141:
 	if ( ++p == pe )
 		goto _test_eof141;
 case 141:
-#line 1715 "src/port_uri.cc"
+#line 1752 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st11;
 		case 93: goto st137;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr92;
+		goto tr95;
 	goto st0;
 tr19:
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st142;
 st142:
 	if ( ++p == pe )
 		goto _test_eof142;
 case 142:
-#line 1731 "src/port_uri.cc"
+#line 1768 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st11;
 		case 93: goto st137;
@@ -1807,15 +1844,15 @@ case 145:
 	} else if ( (*p) >= 65 )
 		goto st80;
 	goto st0;
-tr149:
-#line 147 "src/port_uri.rl"
+tr152:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st46;
 st46:
 	if ( ++p == pe )
 		goto _test_eof46;
 case 46:
-#line 1819 "src/port_uri.cc"
+#line 1856 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 48: goto st7;
 		case 58: goto st47;
@@ -1939,14 +1976,14 @@ case 52:
 		goto st17;
 	goto st0;
 tr64:
-#line 133 "src/port_uri.rl"
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st53;
 st53:
 	if ( ++p == pe )
 		goto _test_eof53;
 case 53:
-#line 1950 "src/port_uri.cc"
+#line 1987 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st54;
 		case 58: goto st21;
@@ -2026,16 +2063,16 @@ case 61:
 		goto tr75;
 	goto st0;
 tr75:
-#line 134 "src/port_uri.rl"
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
 	goto st146;
 st146:
 	if ( ++p == pe )
 		goto _test_eof146;
 case 146:
-#line 2037 "src/port_uri.cc"
+#line 2074 "src/port_uri.cc"
 	if ( (*p) == 58 )
-		goto tr91;
+		goto tr94;
 	goto st0;
 st62:
 	if ( ++p == pe )
@@ -2106,29 +2143,29 @@ case 67:
 		goto st20;
 	goto st0;
 tr11:
-#line 129 "src/port_uri.rl"
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st147;
-tr161:
-#line 151 "src/port_uri.rl"
+tr164:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st147;
 st147:
 	if ( ++p == pe )
 		goto _test_eof147;
 case 147:
-#line 2127 "src/port_uri.cc"
+#line 2164 "src/port_uri.cc"
 	if ( (*p) == 64 )
 		goto tr14;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr161;
+			goto tr164;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st4;
@@ -2136,16 +2173,16 @@ case 147:
 		goto st4;
 	goto st0;
 tr12:
-#line 129 "src/port_uri.rl"
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st148;
 st148:
 	if ( ++p == pe )
 		goto _test_eof148;
 case 148:
-#line 2149 "src/port_uri.cc"
+#line 2186 "src/port_uri.cc"
 	if ( (*p) == 64 )
 		goto tr14;
 	if ( (*p) < 65 ) {
@@ -2383,98 +2420,98 @@ case 163:
 		goto st4;
 	goto st0;
 tr3:
-#line 125 "src/port_uri.rl"
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 133 "src/port_uri.rl"
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
-#line 160 "src/port_uri.rl"
+#line 171 "src/port_uri.rl"
 	{ sport.start   = p; port = 0; }
-#line 161 "src/port_uri.rl"
+#line 172 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st164;
 st164:
 	if ( ++p == pe )
 		goto _test_eof164;
 case 164:
-#line 2402 "src/port_uri.cc"
+#line 2439 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr177;
+			goto tr180;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st128;
 	} else
 		goto st128;
 	goto st74;
-tr177:
-#line 161 "src/port_uri.rl"
+tr180:
+#line 172 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st165;
 st165:
 	if ( ++p == pe )
 		goto _test_eof165;
 case 165:
-#line 2425 "src/port_uri.cc"
+#line 2462 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr178;
+			goto tr181;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st128;
 	} else
 		goto st128;
 	goto st74;
-tr178:
-#line 161 "src/port_uri.rl"
+tr181:
+#line 172 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st166;
 st166:
 	if ( ++p == pe )
 		goto _test_eof166;
 case 166:
-#line 2448 "src/port_uri.cc"
+#line 2485 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st114;
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr179;
+			goto tr182;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st128;
 	} else
 		goto st128;
 	goto st74;
-tr179:
-#line 161 "src/port_uri.rl"
+tr182:
+#line 172 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st167;
 st167:
 	if ( ++p == pe )
 		goto _test_eof167;
 case 167:
-#line 2471 "src/port_uri.cc"
+#line 2508 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr131;
+		case 58: goto tr134;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr179;
+			goto tr182;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st128;
@@ -2482,20 +2519,20 @@ case 167:
 		goto st128;
 	goto st74;
 tr5:
-#line 121 "src/port_uri.rl"
+#line 132 "src/port_uri.rl"
 	{ schema.start = p; }
-#line 125 "src/port_uri.rl"
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st168;
 st168:
 	if ( ++p == pe )
 		goto _test_eof168;
 case 168:
-#line 2497 "src/port_uri.cc"
+#line 2534 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr180;
+		case 58: goto tr183;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -2507,19 +2544,17 @@ case 168:
 	} else
 		goto st168;
 	goto st74;
-tr180:
-#line 122 "src/port_uri.rl"
-	{ schema.end   = p; }
-#line 126 "src/port_uri.rl"
+tr183:
+#line 137 "src/port_uri.rl"
 	{ login.end    = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st68;
 st68:
 	if ( ++p == pe )
 		goto _test_eof68;
 case 68:
-#line 2523 "src/port_uri.cc"
+#line 2558 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 47: goto st69;
 		case 48: goto tr10;
@@ -2547,32 +2582,32 @@ case 70:
 	switch( (*p) ) {
 		case 58: goto st0;
 		case 63: goto st0;
-		case 91: goto tr6;
+		case 91: goto tr85;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2;
+			goto tr83;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr82;
+			goto tr84;
 	} else
-		goto tr82;
-	goto tr0;
+		goto tr84;
+	goto tr82;
 tr7:
-#line 121 "src/port_uri.rl"
+#line 132 "src/port_uri.rl"
 	{ schema.start = p; }
-#line 125 "src/port_uri.rl"
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st169;
 st169:
 	if ( ++p == pe )
 		goto _test_eof169;
 case 169:
-#line 2574 "src/port_uri.cc"
+#line 2609 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr180;
+		case 58: goto tr183;
 		case 63: goto st0;
 		case 110: goto st170;
 	}
@@ -2590,7 +2625,7 @@ case 169:
 		goto _test_eof170;
 case 170:
 	switch( (*p) ) {
-		case 58: goto tr180;
+		case 58: goto tr183;
 		case 63: goto st0;
 		case 105: goto st171;
 	}
@@ -2608,7 +2643,7 @@ case 170:
 		goto _test_eof171;
 case 171:
 	switch( (*p) ) {
-		case 58: goto tr180;
+		case 58: goto tr183;
 		case 63: goto st0;
 		case 120: goto st172;
 	}
@@ -2626,7 +2661,7 @@ case 171:
 		goto _test_eof172;
 case 172:
 	switch( (*p) ) {
-		case 58: goto tr185;
+		case 58: goto tr188;
 		case 63: goto st0;
 	}
 	if ( (*p) < 65 ) {
@@ -2638,19 +2673,17 @@ case 172:
 	} else
 		goto st168;
 	goto st74;
-tr185:
-#line 122 "src/port_uri.rl"
-	{ schema.end   = p; }
-#line 126 "src/port_uri.rl"
+tr188:
+#line 137 "src/port_uri.rl"
 	{ login.end    = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st71;
 st71:
 	if ( ++p == pe )
 		goto _test_eof71;
 case 71:
-#line 2654 "src/port_uri.cc"
+#line 2687 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 47: goto st72;
 		case 48: goto tr10;
@@ -2676,104 +2709,112 @@ case 72:
 		goto _test_eof73;
 case 73:
 	switch( (*p) ) {
-		case 58: goto tr87;
-		case 63: goto tr87;
-		case 91: goto tr89;
+		case 58: goto tr90;
+		case 63: goto tr90;
+		case 91: goto tr92;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr86;
+			goto tr89;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr88;
+			goto tr91;
 	} else
-		goto tr88;
-	goto tr85;
-tr85:
-#line 169 "src/port_uri.rl"
+		goto tr91;
+	goto tr88;
+tr88:
+#line 180 "src/port_uri.rl"
+	{ path.start = p; }
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+	goto st173;
+tr232:
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st173;
 st173:
 	if ( ++p == pe )
 		goto _test_eof173;
 case 173:
-#line 2703 "src/port_uri.cc"
+#line 2744 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	goto st173;
-tr187:
-#line 147 "src/port_uri.rl"
+tr190:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st174;
-tr219:
-#line 134 "src/port_uri.rl"
+tr222:
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st174;
-tr280:
-#line 143 "src/port_uri.rl"
+tr285:
+#line 154 "src/port_uri.rl"
 	{ ip6.end   = p - 1; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st174;
 st174:
 	if ( ++p == pe )
 		goto _test_eof174;
 case 174:
-#line 2729 "src/port_uri.cc"
+#line 2770 "src/port_uri.cc"
 	if ( (*p) < 65 ) {
 		if ( 49 <= (*p) && (*p) <= 57 )
-			goto tr189;
+			goto tr192;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr190;
+			goto tr193;
 	} else
-		goto tr190;
+		goto tr193;
 	goto st175;
-tr87:
-#line 169 "src/port_uri.rl"
+tr90:
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
 	goto st175;
 st175:
 	if ( ++p == pe )
 		goto _test_eof175;
 case 175:
-#line 2747 "src/port_uri.cc"
+#line 2788 "src/port_uri.cc"
 	goto st175;
-tr189:
-#line 155 "src/port_uri.rl"
+tr192:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st176;
-tr191:
-#line 151 "src/port_uri.rl"
+tr194:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st176;
 st176:
 	if ( ++p == pe )
 		goto _test_eof176;
 case 176:
-#line 2765 "src/port_uri.cc"
+#line 2806 "src/port_uri.cc"
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr191;
+		goto tr194;
 	goto st175;
-tr190:
-#line 155 "src/port_uri.rl"
+tr193:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st177;
 st177:
 	if ( ++p == pe )
 		goto _test_eof177;
 case 177:
-#line 2777 "src/port_uri.cc"
+#line 2818 "src/port_uri.cc"
 	if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st178;
@@ -2925,24 +2966,26 @@ case 191:
 		goto _test_eof192;
 case 192:
 	goto st175;
-tr86:
-#line 125 "src/port_uri.rl"
+tr89:
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 169 "src/port_uri.rl"
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
-#line 146 "src/port_uri.rl"
-	{ host.start   = p; }
 #line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st193;
 st193:
 	if ( ++p == pe )
 		goto _test_eof193;
 case 193:
-#line 2943 "src/port_uri.cc"
+#line 2986 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr209;
+		case 58: goto tr212;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -2959,7 +3002,7 @@ case 193:
 		goto _test_eof194;
 case 194:
 	switch( (*p) ) {
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -2971,7 +3014,7 @@ case 194:
 case 195:
 	switch( (*p) ) {
 		case 46: goto st196;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -2982,7 +3025,7 @@ case 195:
 		goto _test_eof196;
 case 196:
 	switch( (*p) ) {
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -2994,7 +3037,7 @@ case 196:
 case 197:
 	switch( (*p) ) {
 		case 46: goto st198;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3005,7 +3048,7 @@ case 197:
 		goto _test_eof198;
 case 198:
 	switch( (*p) ) {
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3016,7 +3059,7 @@ case 198:
 		goto _test_eof199;
 case 199:
 	switch( (*p) ) {
-		case 58: goto tr219;
+		case 58: goto tr222;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3027,7 +3070,7 @@ case 199:
 		goto _test_eof200;
 case 200:
 	switch( (*p) ) {
-		case 58: goto tr219;
+		case 58: goto tr222;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3038,7 +3081,7 @@ case 200:
 		goto _test_eof201;
 case 201:
 	switch( (*p) ) {
-		case 58: goto tr219;
+		case 58: goto tr222;
 		case 63: goto st175;
 	}
 	goto st173;
@@ -3048,7 +3091,7 @@ case 201:
 case 202:
 	switch( (*p) ) {
 		case 46: goto st198;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3060,7 +3103,7 @@ case 202:
 case 203:
 	switch( (*p) ) {
 		case 46: goto st198;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	goto st173;
@@ -3070,7 +3113,7 @@ case 203:
 case 204:
 	switch( (*p) ) {
 		case 46: goto st196;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3082,7 +3125,7 @@ case 204:
 case 205:
 	switch( (*p) ) {
 		case 46: goto st196;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	goto st173;
@@ -3092,7 +3135,7 @@ case 205:
 case 206:
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr209;
+		case 58: goto tr212;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3110,7 +3153,7 @@ case 206:
 case 207:
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr209;
+		case 58: goto tr212;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3122,21 +3165,23 @@ case 207:
 	} else
 		goto st208;
 	goto st173;
-tr88:
-#line 125 "src/port_uri.rl"
+tr91:
+#line 136 "src/port_uri.rl"
 	{ login.start  = p; }
-#line 169 "src/port_uri.rl"
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
-#line 146 "src/port_uri.rl"
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
 	goto st208;
 st208:
 	if ( ++p == pe )
 		goto _test_eof208;
 case 208:
-#line 3138 "src/port_uri.cc"
+#line 3183 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr209;
+		case 58: goto tr212;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3148,39 +3193,39 @@ case 208:
 	} else
 		goto st208;
 	goto st173;
-tr209:
-#line 126 "src/port_uri.rl"
+tr212:
+#line 137 "src/port_uri.rl"
 	{ login.end    = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st209;
 st209:
 	if ( ++p == pe )
 		goto _test_eof209;
 case 209:
-#line 3162 "src/port_uri.cc"
+#line 3207 "src/port_uri.cc"
 	if ( (*p) == 48 )
-		goto tr224;
+		goto tr227;
 	if ( (*p) < 65 ) {
 		if ( 49 <= (*p) && (*p) <= 57 )
-			goto tr225;
+			goto tr228;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr226;
+			goto tr229;
 	} else
-		goto tr226;
+		goto tr229;
 	goto st175;
-tr224:
-#line 129 "src/port_uri.rl"
+tr227:
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
 	goto st210;
 st210:
 	if ( ++p == pe )
 		goto _test_eof210;
 case 210:
-#line 3182 "src/port_uri.cc"
+#line 3227 "src/port_uri.cc"
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -3190,39 +3235,39 @@ case 210:
 	} else
 		goto st210;
 	goto st175;
-tr228:
-#line 130 "src/port_uri.rl"
+tr231:
+#line 141 "src/port_uri.rl"
 	{ password.end   = p; }
 	goto st211;
 st211:
 	if ( ++p == pe )
 		goto _test_eof211;
 case 211:
-#line 3202 "src/port_uri.cc"
+#line 3247 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr87;
-		case 63: goto tr87;
-		case 91: goto tr89;
+		case 58: goto tr90;
+		case 63: goto tr90;
+		case 91: goto tr234;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr229;
-	goto tr85;
-tr229:
-#line 169 "src/port_uri.rl"
+		goto tr233;
+	goto tr232;
+tr233:
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
-#line 146 "src/port_uri.rl"
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 133 "src/port_uri.rl"
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st212;
 st212:
 	if ( ++p == pe )
 		goto _test_eof212;
 case 212:
-#line 3223 "src/port_uri.cc"
+#line 3268 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3234,7 +3279,7 @@ case 212:
 case 213:
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
@@ -3246,25 +3291,35 @@ case 213:
 case 214:
 	switch( (*p) ) {
 		case 46: goto st194;
-		case 58: goto tr187;
+		case 58: goto tr190;
 		case 63: goto st175;
 	}
 	goto st173;
-tr89:
-#line 169 "src/port_uri.rl"
+tr92:
+#line 180 "src/port_uri.rl"
 	{ path.start = p; }
-#line 146 "src/port_uri.rl"
+#line 133 "src/port_uri.rl"
+	{ schema.end   = p - 3; }
+#line 157 "src/port_uri.rl"
 	{ host.start   = p; }
-#line 142 "src/port_uri.rl"
+#line 153 "src/port_uri.rl"
+	{ ip6.start = p + 1; }
+	goto st215;
+tr234:
+#line 180 "src/port_uri.rl"
+	{ path.start = p; }
+#line 157 "src/port_uri.rl"
+	{ host.start   = p; }
+#line 153 "src/port_uri.rl"
 	{ ip6.start = p + 1; }
 	goto st215;
 st215:
 	if ( ++p == pe )
 		goto _test_eof215;
 case 215:
-#line 3266 "src/port_uri.cc"
+#line 3321 "src/port_uri.cc"
 	switch( (*p) ) {
-		case 58: goto tr233;
+		case 58: goto tr238;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3281,7 +3336,7 @@ case 215:
 		goto _test_eof216;
 case 216:
 	switch( (*p) ) {
-		case 58: goto tr235;
+		case 58: goto tr240;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3298,7 +3353,7 @@ case 216:
 		goto _test_eof217;
 case 217:
 	switch( (*p) ) {
-		case 58: goto tr235;
+		case 58: goto tr240;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3315,7 +3370,7 @@ case 217:
 		goto _test_eof218;
 case 218:
 	switch( (*p) ) {
-		case 58: goto tr235;
+		case 58: goto tr240;
 		case 63: goto st175;
 	}
 	if ( (*p) < 65 ) {
@@ -3332,19 +3387,19 @@ case 218:
 		goto _test_eof219;
 case 219:
 	switch( (*p) ) {
-		case 58: goto tr235;
+		case 58: goto tr240;
 		case 63: goto st175;
 	}
 	goto st173;
-tr235:
-#line 147 "src/port_uri.rl"
+tr240:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st220;
 st220:
 	if ( ++p == pe )
 		goto _test_eof220;
 case 220:
-#line 3348 "src/port_uri.cc"
+#line 3403 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 48: goto st221;
 		case 58: goto st225;
@@ -3353,17 +3408,17 @@ case 220:
 	if ( (*p) < 71 ) {
 		if ( (*p) > 57 ) {
 			if ( 65 <= (*p) && (*p) <= 70 )
-				goto tr241;
+				goto tr246;
 		} else if ( (*p) >= 49 )
-			goto tr239;
+			goto tr244;
 	} else if ( (*p) > 90 ) {
 		if ( (*p) > 102 ) {
 			if ( 103 <= (*p) && (*p) <= 122 )
-				goto tr190;
+				goto tr193;
 		} else if ( (*p) >= 97 )
-			goto tr241;
+			goto tr246;
 	} else
-		goto tr190;
+		goto tr193;
 	goto st175;
 st221:
 	if ( ++p == pe )
@@ -3959,103 +4014,103 @@ case 259:
 		goto _test_eof260;
 case 260:
 	if ( (*p) == 58 )
-		goto tr280;
+		goto tr285;
 	goto st175;
-tr239:
-#line 155 "src/port_uri.rl"
+tr244:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st261;
 st261:
 	if ( ++p == pe )
 		goto _test_eof261;
 case 261:
-#line 3977 "src/port_uri.cc"
+#line 4032 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st225;
 		case 93: goto st260;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr281;
+			goto tr286;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st222;
 	} else
 		goto st222;
 	goto st175;
-tr281:
-#line 151 "src/port_uri.rl"
+tr286:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st262;
 st262:
 	if ( ++p == pe )
 		goto _test_eof262;
 case 262:
-#line 3999 "src/port_uri.cc"
+#line 4054 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st225;
 		case 93: goto st260;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr282;
+			goto tr287;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st223;
 	} else
 		goto st223;
 	goto st175;
-tr282:
-#line 151 "src/port_uri.rl"
+tr287:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st263;
 st263:
 	if ( ++p == pe )
 		goto _test_eof263;
 case 263:
-#line 4021 "src/port_uri.cc"
+#line 4076 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st225;
 		case 93: goto st260;
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr283;
+			goto tr288;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st224;
 	} else
 		goto st224;
 	goto st175;
-tr283:
-#line 151 "src/port_uri.rl"
+tr288:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st264;
 st264:
 	if ( ++p == pe )
 		goto _test_eof264;
 case 264:
-#line 4043 "src/port_uri.cc"
+#line 4098 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st225;
 		case 93: goto st260;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr191;
+		goto tr194;
 	goto st175;
-tr241:
-#line 155 "src/port_uri.rl"
+tr246:
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st265;
 st265:
 	if ( ++p == pe )
 		goto _test_eof265;
 case 265:
-#line 4059 "src/port_uri.cc"
+#line 4114 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 58: goto st225;
 		case 93: goto st260;
@@ -4135,15 +4190,15 @@ case 268:
 	} else if ( (*p) >= 65 )
 		goto st181;
 	goto st175;
-tr233:
-#line 147 "src/port_uri.rl"
+tr238:
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	goto st269;
 st269:
 	if ( ++p == pe )
 		goto _test_eof269;
 case 269:
-#line 4147 "src/port_uri.cc"
+#line 4202 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 48: goto st221;
 		case 58: goto st270;
@@ -4152,17 +4207,17 @@ case 269:
 	if ( (*p) < 71 ) {
 		if ( (*p) > 57 ) {
 			if ( 65 <= (*p) && (*p) <= 70 )
-				goto tr241;
+				goto tr246;
 		} else if ( (*p) >= 49 )
-			goto tr239;
+			goto tr244;
 	} else if ( (*p) > 90 ) {
 		if ( (*p) > 102 ) {
 			if ( 103 <= (*p) && (*p) <= 122 )
-				goto tr190;
+				goto tr193;
 		} else if ( (*p) >= 97 )
-			goto tr241;
+			goto tr246;
 	} else
-		goto tr190;
+		goto tr193;
 	goto st175;
 st270:
 	if ( ++p == pe )
@@ -4259,22 +4314,22 @@ case 275:
 	}
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr293;
+			goto tr298;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
 			goto st231;
 	} else
 		goto st231;
 	goto st175;
-tr293:
-#line 133 "src/port_uri.rl"
+tr298:
+#line 144 "src/port_uri.rl"
 	{ ip4.start = p; }
 	goto st276;
 st276:
 	if ( ++p == pe )
 		goto _test_eof276;
 case 276:
-#line 4278 "src/port_uri.cc"
+#line 4333 "src/port_uri.cc"
 	switch( (*p) ) {
 		case 46: goto st277;
 		case 58: goto st235;
@@ -4333,7 +4388,7 @@ case 281:
 		goto _test_eof282;
 case 282:
 	if ( (*p) == 93 )
-		goto tr304;
+		goto tr309;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st283;
 	goto st175;
@@ -4342,7 +4397,7 @@ case 282:
 		goto _test_eof283;
 case 283:
 	if ( (*p) == 93 )
-		goto tr304;
+		goto tr309;
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto st284;
 	goto st175;
@@ -4351,19 +4406,19 @@ case 283:
 		goto _test_eof284;
 case 284:
 	if ( (*p) == 93 )
-		goto tr304;
+		goto tr309;
 	goto st175;
-tr304:
-#line 134 "src/port_uri.rl"
+tr309:
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
 	goto st285;
 st285:
 	if ( ++p == pe )
 		goto _test_eof285;
 case 285:
-#line 4365 "src/port_uri.cc"
+#line 4420 "src/port_uri.cc"
 	if ( (*p) == 58 )
-		goto tr187;
+		goto tr190;
 	goto st175;
 st286:
 	if ( ++p == pe )
@@ -4433,49 +4488,49 @@ case 291:
 	} else
 		goto st234;
 	goto st175;
-tr225:
-#line 129 "src/port_uri.rl"
+tr228:
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
-#line 150 "src/port_uri.rl"
+#line 161 "src/port_uri.rl"
 	{ dport.start   = p; port = 0; }
-#line 151 "src/port_uri.rl"
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st292;
-tr309:
-#line 151 "src/port_uri.rl"
+tr314:
+#line 162 "src/port_uri.rl"
 	{ port = port * 10 + (int)(*p - '0'); }
 	goto st292;
 st292:
 	if ( ++p == pe )
 		goto _test_eof292;
 case 292:
-#line 4455 "src/port_uri.cc"
+#line 4510 "src/port_uri.cc"
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr309;
+			goto tr314;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
 			goto st210;
 	} else
 		goto st210;
 	goto st175;
-tr226:
-#line 129 "src/port_uri.rl"
+tr229:
+#line 140 "src/port_uri.rl"
 	{ password.start = p; }
-#line 155 "src/port_uri.rl"
+#line 166 "src/port_uri.rl"
 	{ service.start = p; }
 	goto st293;
 st293:
 	if ( ++p == pe )
 		goto _test_eof293;
 case 293:
-#line 4477 "src/port_uri.cc"
+#line 4532 "src/port_uri.cc"
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4490,7 +4545,7 @@ case 293:
 		goto _test_eof294;
 case 294:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4505,7 +4560,7 @@ case 294:
 		goto _test_eof295;
 case 295:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4520,7 +4575,7 @@ case 295:
 		goto _test_eof296;
 case 296:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4535,7 +4590,7 @@ case 296:
 		goto _test_eof297;
 case 297:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4550,7 +4605,7 @@ case 297:
 		goto _test_eof298;
 case 298:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4565,7 +4620,7 @@ case 298:
 		goto _test_eof299;
 case 299:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4580,7 +4635,7 @@ case 299:
 		goto _test_eof300;
 case 300:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4595,7 +4650,7 @@ case 300:
 		goto _test_eof301;
 case 301:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4610,7 +4665,7 @@ case 301:
 		goto _test_eof302;
 case 302:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4625,7 +4680,7 @@ case 302:
 		goto _test_eof303;
 case 303:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4640,7 +4695,7 @@ case 303:
 		goto _test_eof304;
 case 304:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4655,7 +4710,7 @@ case 304:
 		goto _test_eof305;
 case 305:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4670,7 +4725,7 @@ case 305:
 		goto _test_eof306;
 case 306:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4685,7 +4740,7 @@ case 306:
 		goto _test_eof307;
 case 307:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -4700,7 +4755,7 @@ case 307:
 		goto _test_eof308;
 case 308:
 	if ( (*p) == 64 )
-		goto tr228;
+		goto tr231;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
 			goto st210;
@@ -5052,7 +5107,7 @@ case 308:
 	case 170: 
 	case 171: 
 	case 172: 
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 76: 
@@ -5091,12 +5146,12 @@ case 308:
 	case 161: 
 	case 162: 
 	case 163: 
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
 	break;
 	case 94: 
 	case 95: 
-#line 166 "src/port_uri.rl"
+#line 177 "src/port_uri.rl"
 	{ path.end   = p; }
 	break;
 	case 174: 
@@ -5166,36 +5221,36 @@ case 308:
 	case 289: 
 	case 290: 
 	case 291: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
 	break;
 	case 119: 
 	case 120: 
 	case 121: 
-#line 134 "src/port_uri.rl"
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 137: 
-#line 143 "src/port_uri.rl"
+#line 154 "src/port_uri.rl"
 	{ ip6.end   = p - 1; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 164: 
 	case 165: 
 	case 166: 
 	case 167: 
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
-#line 162 "src/port_uri.rl"
+#line 173 "src/port_uri.rl"
 	{ sport.end     = p; }
 	break;
 	case 93: 
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
-#line 166 "src/port_uri.rl"
+#line 177 "src/port_uri.rl"
 	{ path.end   = p; }
 	break;
 	case 75: 
@@ -5204,9 +5259,9 @@ case 308:
 	case 140: 
 	case 141: 
 	case 147: 
-#line 152 "src/port_uri.rl"
+#line 163 "src/port_uri.rl"
 	{ dport.end	 = p; }
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
 	break;
 	case 97: 
@@ -5225,9 +5280,9 @@ case 308:
 	case 110: 
 	case 111: 
 	case 112: 
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
-#line 166 "src/port_uri.rl"
+#line 177 "src/port_uri.rl"
 	{ path.end   = p; }
 	break;
 	case 173: 
@@ -5253,9 +5308,9 @@ case 308:
 	case 218: 
 	case 219: 
 	case 285: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 177: 
@@ -5294,35 +5349,35 @@ case 308:
 	case 306: 
 	case 307: 
 	case 308: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
 	break;
 	case 96: 
-#line 152 "src/port_uri.rl"
+#line 163 "src/port_uri.rl"
 	{ dport.end	 = p; }
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
-#line 166 "src/port_uri.rl"
+#line 177 "src/port_uri.rl"
 	{ path.end   = p; }
 	break;
 	case 199: 
 	case 200: 
 	case 201: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
-#line 134 "src/port_uri.rl"
+#line 145 "src/port_uri.rl"
 	{ ip4.end   = p; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 260: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
-#line 143 "src/port_uri.rl"
+#line 154 "src/port_uri.rl"
 	{ ip6.end   = p - 1; }
-#line 147 "src/port_uri.rl"
+#line 158 "src/port_uri.rl"
 	{ host.end     = p; }
 	break;
 	case 176: 
@@ -5331,21 +5386,21 @@ case 308:
 	case 263: 
 	case 264: 
 	case 292: 
-#line 170 "src/port_uri.rl"
+#line 181 "src/port_uri.rl"
 	{ path.end   = p; }
-#line 152 "src/port_uri.rl"
+#line 163 "src/port_uri.rl"
 	{ dport.end	 = p; }
-#line 156 "src/port_uri.rl"
+#line 167 "src/port_uri.rl"
 	{ service.end   = p; }
 	break;
-#line 5342 "src/port_uri.cc"
+#line 5397 "src/port_uri.cc"
 	}
 	}
 
 	_out: {}
 	}
 
-#line 187 "src/port_uri.rl"
+#line 198 "src/port_uri.rl"
 
 
 	(void)port_uri_first_final;
diff --git a/src/port_uri.rl b/src/port_uri.rl
index 62d4ad9f6a50c4c0c23d17bffa23ba552ba65b1b..5d99f7636440f61361874dfab2bc91d80bd81a28 100644
--- a/src/port_uri.rl
+++ b/src/port_uri.rl
@@ -61,12 +61,23 @@ port_uri_to_string(const struct port_uri * uri)
 			    shost, sizeof(shost),
 			    sservice, sizeof(sservice),
 			    NI_NUMERICHOST|NI_NUMERICSERV);
-		if (uri->addr.sa_family == AF_INET)
-			snprintf(str, sizeof(str), "%s://%s:%s",
-				 uri->schema, shost, sservice);
-		else
-			snprintf(str, sizeof(str), "%s://[%s]:%s",
-				 uri->schema, shost, sservice);
+		if (uri->addr.sa_family == AF_INET) {
+			if (strncmp(uri->schema, "tcp", 3) == 0) {
+				snprintf(str, sizeof(str), "%s:%s",
+					 shost, sservice);
+			} else {
+				snprintf(str, sizeof(str), "%s://%s:%s",
+					 uri->schema, shost, sservice);
+			}
+		} else {
+			if (strncmp(uri->schema, "tcp", 3) == 0) {
+				snprintf(str, sizeof(str), "%s:%s",
+					 shost, sservice);
+			} else {
+				snprintf(str, sizeof(str), "%s://[%s]:%s",
+					 uri->schema, shost, sservice);
+			}
+		}
                 break;
 	}
 	case AF_UNIX:
@@ -117,9 +128,9 @@ port_uri_parse(struct port_uri *uri, const char *p)
 		hex1_4 = ([0-9a-fA-F]{1,4});
 
 
-		schema		= (alpha+)
+		schema		= ((alpha+) "://")
 			>{ schema.start = p; }
-		    %{ schema.end   = p; };
+		    %{ schema.end   = p - 3; };
 
 		login		= (alnum+)
 			>{ login.start  = p; }
@@ -174,7 +185,7 @@ port_uri_parse(struct port_uri *uri, const char *p)
 		    ("unix://"
 		      ((login ":" password "@") ?) file) |
 
-		     ((schema "://")?
+		     ((schema)?
 			((login ":" password "@")?)
 			host
 			((":" service)?))		    |
diff --git a/test/replication/swap.test.py b/test/replication/swap.test.py
index f349b991e8e6190769eb698373e49042b6c16566..8709ab8e650df82722e8c06987eac69fde6676fa 100644
--- a/test/replication/swap.test.py
+++ b/test/replication/swap.test.py
@@ -1,10 +1,13 @@
 import os
 import tarantool
 from lib.tarantool_server import TarantoolServer
+import re
+import yaml
 
 REPEAT = 20
 ID_BEGIN = 0
 ID_STEP = 5
+HOST = '127.0.0.1'
 LOGIN = 'test'
 PASSWORD = 'pass123456'
 
@@ -21,7 +24,7 @@ master = server
 master.admin("box.schema.user.create('%s', { password = '%s'})" % (LOGIN, PASSWORD))
 master.admin("box.schema.user.grant('%s', 'read,write,execute', 'universe')" % LOGIN)
 master.sql.py_con.authenticate(LOGIN, PASSWORD)
-master.uri = '%s:%s@127.0.0.1:%s' % (LOGIN, PASSWORD, master.sql.port)
+master.uri = '%s:%s@%s:%s' % (LOGIN, PASSWORD, HOST, master.sql.port)
 os.putenv('MASTER_PORT', master.uri)
 
 # replica server
@@ -29,13 +32,20 @@ replica = TarantoolServer()
 replica.script = "replication/replica.lua"
 replica.vardir = os.path.join(server.vardir, 'replica')
 replica.deploy()
-replica.uri = '%s:%s@127.0.0.1:%s' % (LOGIN, PASSWORD, replica.sql.port)
+replica.uri = '%s:%s@%s:%s' % (LOGIN, PASSWORD, HOST, replica.sql.port)
 replica.admin("while box.space['_priv']:len() < 1 do require('fiber').sleep(0.01) end")
 replica.sql.py_con.authenticate(LOGIN, PASSWORD)
 
 master.admin("s = box.schema.create_space('tweedledum', {id = 0})")
 master.admin("s:create_index('primary', {type = 'hash'})")
 
+## gh-343: replica.cc must not add login and password to proc title
+status = replica.get_param("status")
+host_port = "%s:%s" % (HOST, master.sql.port)
+m = re.search(r'replica/(.*)/.*', status)
+if not m or m.group(1) != host_port:
+    print 'invalid box.info.status', status, 'expected host:port', host_port
+
 master_id = master.get_param('node')['id']
 replica_id = replica.get_param('node')['id']
 
diff --git a/test/unit/port_uri.cc b/test/unit/port_uri.cc
index b5ed05f4255dd0647adddba16d11073f09d051d4..aa50ad077c92ce1919e71138f68ffe2fe37c087d 100644
--- a/test/unit/port_uri.cc
+++ b/test/unit/port_uri.cc
@@ -2,7 +2,7 @@
 #include <port_uri.h>
 #include <string.h>
 
-#define PLAN	34
+#define PLAN	40
 
 int
 main(void)
@@ -25,7 +25,7 @@ main(void)
 
 	is(port_uri_parse(&uri, "123"), 0, "123");
 	is(strcmp(uri.schema, "tcp"), 0, "tcp://");
-	is(strcmp(port_uri_to_string(&uri), "tcp://0.0.0.0:123"), 0,
+	is(strcmp(port_uri_to_string(&uri), "0.0.0.0:123"), 0,
 		"to_string");
 
 
@@ -41,8 +41,11 @@ main(void)
 	is(strcmp(uri.schema, "http"), 0, "http://");
 	is(strcmp(port_uri_to_string(&uri), "http://11.2.3.4:123"), 0,
 		"to_string");
-
-
+	is(port_uri_parse(&uri, "http://user:pass@127.0.0.1:12345"), 0,
+		"http://user:pass@127.0.0.1:12345");
+	is(strcmp(uri.login, "user"), 0, "user");
+	is(strcmp(uri.password, "pass"), 0, "pass");
+	is(strcmp(uri.schema, "http"), 0, "http");
 
 
 	is(port_uri_parse(&uri, "schema://[2001:0db8:11a3:09d7::1]"),
@@ -56,23 +59,26 @@ main(void)
 
 
 
+
 	is(port_uri_parse(&uri, "128.0.0.1"), 0, "127.0.0.1");
-	is(strcmp(port_uri_to_string(&uri), "tcp://128.0.0.1:0"), 0,
+	is(strcmp(port_uri_to_string(&uri), "128.0.0.1:0"), 0,
 		"to_string");
 
 	is(port_uri_parse(&uri, "128.0.0.1:22"), 0, "127.0.0.1:22");
-	is(strcmp(port_uri_to_string(&uri), "tcp://128.0.0.1:22"), 0,
+	is(strcmp(port_uri_to_string(&uri), "128.0.0.1:22"), 0,
 		"to_string");
 
 	is(port_uri_parse(&uri, "login:password@127.0.0.1"), 0,
 	   "login:password@127.0.0.1");
 	is(strcmp(uri.login, "login"), 0, "login");
 	is(strcmp(uri.password, "password"), 0, "password");
+	is(strcmp(uri.schema, "tcp"), 0, "default schema");
 
 	is(port_uri_parse(&uri, "unix://login:password@/path/to"), 0,
 	   "unix://login:password@/path/to");
 	is(strcmp(uri.login, "login"), 0, "login");
 	is(strcmp(uri.password, "password"), 0, "password");
+	is(strcmp(uri.schema, "unix"), 0, "unix");
 	is(strcmp(port_uri_to_string(&uri), "unix:///path/to"), 0,
 		"to_string");
 
diff --git a/test/unit/port_uri.result b/test/unit/port_uri.result
index 342cf222e3610a84568faa45d301c539cfa97858..751cc2083c973c2a58075ea17d8b6c07a5a55dff 100644
--- a/test/unit/port_uri.result
+++ b/test/unit/port_uri.result
@@ -1,4 +1,4 @@
-1..34
+1..40
 ok 1 - /file
 ok 2 - to_string
 ok 3 - unix://
@@ -14,22 +14,28 @@ ok 12 - to_string
 ok 13 - http://11.2.3.4:123
 ok 14 - http://
 ok 15 - to_string
-ok 16 - schema://[2001:0db8:11a3:09d7::1]
-ok 17 - to_string
-ok 18 - invalid schema://[2001::11a3:09d7::1]
-ok 19 - 127.0.0.1
-ok 20 - to_string
-ok 21 - 127.0.0.1:22
-ok 22 - to_string
-ok 23 - login:password@127.0.0.1
-ok 24 - login
-ok 25 - password
-ok 26 - unix://login:password@/path/to
-ok 27 - login
-ok 28 - password
-ok 29 - to_string
-ok 30 - invalid uri
-ok 31 - valid uri
-ok 32 - service to port number
-ok 33 - valid uri
-ok 34 - service converted
+ok 16 - http://user:pass@127.0.0.1:12345
+ok 17 - user
+ok 18 - pass
+ok 19 - http
+ok 20 - schema://[2001:0db8:11a3:09d7::1]
+ok 21 - to_string
+ok 22 - invalid schema://[2001::11a3:09d7::1]
+ok 23 - 127.0.0.1
+ok 24 - to_string
+ok 25 - 127.0.0.1:22
+ok 26 - to_string
+ok 27 - login:password@127.0.0.1
+ok 28 - login
+ok 29 - password
+ok 30 - default schema
+ok 31 - unix://login:password@/path/to
+ok 32 - login
+ok 33 - password
+ok 34 - unix
+ok 35 - to_string
+ok 36 - invalid uri
+ok 37 - valid uri
+ok 38 - service to port number
+ok 39 - valid uri
+ok 40 - service converted